当前位置: 首页 > 面试题库 >

JSF 2-具有日期键映射的f:selectItems

田志
2023-03-14
问题内容

下面的selectItems是从会话作用域映射提供的。当用户单击Submit按钮时,应该在RequestScoped后备bean中设置一个日期字段并将其显示在页面上。

    <h:selectOneMenu value="#{dropDown.selectedDate}">
        <f:selectItems value="#{mapValues.dateMap.entrySet()}" var="entry" itemLabel="#{entry.value}" itemValue="#{entry.key}" />
    </h:selectOneMenu>
    <h:commandButton value="Submit" />
You selected Date #{dropDown.selectedDate}

但是,收到以下转换错误:

Conversion Error setting value 'Wed Dec 26 15:09:32 EST 2012' for 'null Converter'.

我不确定为什么会收到此错误。我尝试在selectOneMenu标记上设置javax.faces.DateTime转换器,但随后收到一个甚至更神秘的验证错误。

找到了一条帖子,建议检查equal()方法是否可用,并且选择的项目位于下拉菜单中,在这种情况下,这两个选项均应为true。

我可以想到的一种解决方法是将地图更改为“字符串键控”,其中日期另存为字符串。但这似乎是一个过大的杀伤力。

关于如何进行此设置的任何建议?

后备豆:

@Named
@RequestScoped
public class DropDown {

    private Date selectedDate;

    public Date getSelectedDate() {
        return selectedDate;
    }

    public void setSelectedDate(Date selectedDate) {
        this.selectedDate = selectedDate;
    }

}

地图豆:

@Named
@SessionScoped
public class MapValues implements Serializable {

    private Map<Date, String> dateMap;

    @PostConstruct
    public void init() {        
        dateMap = new LinkedHashMap<Date, String>();
        dateMap.put(new Date(), "DATEVALUE1");      
    }

    public Map<Date, String> getDateMap() {
        return dateMap;
    }

    public void setDateMap(Map<Date, String> dateMap) {
        this.dateMap = dateMap;
    }
}

谢谢!


问题答案:

使用日期时间转换器应该是正确的解决方案。您的“更多神秘验证错误”原来是这样的:

它是“ form:location:验证错误:值无效

Object#equals()所选项目的测试未返回true任何可用项目时,将发生这种情况。因此,所选内容Date与任何可用Date实例都不匹配。

实际上,converter="javax.faces.DateTime"(aka <f:convertDateTime/>)默认会忽略时间部分。默认情况下,它会打印“短”日期样式,例如“ 2012年12月27日”,在浏览器中单击鼠标右键,然后选择“ 查看源代码”_以自己 _查看

<option value="Dec 27, 2012">DATEVALUE1</option>

当JSF将以这种格式提交的字符串值转换回具体Date实例时,基本上变成了地图中提供的日期2012-12-27 00:00:00.000显然仍设置了时间部分的情况,这导致equals()总是失败,除非可用日期的地图是由巧合产生的正是00:00:00.000午夜。

有2个解决此问题的方法:

  1. 删除映射中日期的时间部分。您可以使用java.util.Calendar它(或者更好的是Joda Time)。

  2. 改用<f:convertDateTime pattern="yyyyMMddHHmmssSSS"/>整个日期/时间,直到最后一毫秒。

    <h:selectOneMenu value="#{dropDown.selectedDate}">
    <f:selectItems value="#{mapValues.dateMap.entrySet()}" var="entry" itemLabel="#{entry.value}" itemValue="#{entry.key}" />
    <f:convertDateTime pattern="yyyyMMddHHmmssSSS" />
    



 类似资料:
  • 问题内容: 我正在创建一个需要存储键值对的程序。该程序需要接受键形式的请求,并返回相应的值。 问题在于每个键有时有多个值,并且map类不允许重复的键。 这些值是数字,因此无法像使用字符串那样有意义地连接这些值。 对于每个键可以有多个数值的事实,是否有任何优雅的解释方法?我希望返回每个数字,而不是随机返回一个数字。 问题答案: $ cat YourMap.java public class Your

  • 问题内容: 使用Hibernate,可以创建一个组合ID,其中要映射到该ID的列之一可以为空值吗? 这是为了处理具有唯一键的旧表,该键可以具有空值,但不能具有主键。 我意识到我可以只向表中添加一个新的主键列,但是我想知道是否有任何方法可以避免这样做。 问题答案: 否。主键不能为null。

  • 我有两张阵列图。 有没有办法用流来完成这个任务? 或者我必须通过映射迭代?

  • 我可以有一个哈希图在Java看起来像这样吗? 我的问题和这里的类似问题 我是Java新手。所以我想知道的是,如果我需要上面这样的东西,如果它无效,什么是最好的数据结构?

  • 对于使用Java Spring RestTemplate完成的HTTP请求,我得到一个JSON键值对对象的响应,该对象带有动态键,如下所示。 回应: 如何将响应对象映射到POJO或映射? 我使用RestTemplate如下所示。

  • 假设我有一组字符串和一个散列函数(或任何单边函数)和一个测试函数。我想用Java8流创建一个从输入字符串到通过测试函数的哈希值的映射。我的问题是如何在中编写? 看来老的for循环是最简洁的解决方案。