JSF 2 - F:selectItems的使用日期键地图(JSF 2 - f:selectIt

2019-07-17 14:22发布

下面selectItems的是从一个会话域地图喂养。 当用户点击提交按钮,它应该设定一个日期字段作用域支持豆请求,并在页面上显示。

    <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转换器,但随后收到一个更加神秘的验证错误。

发现后该建议检查是否相等()方法是可用的,并且该项目选择是在下拉,这两者应该在此情况下是真实的。

一个解决办法,我能想到的是改变我的地图是字符串键,后者的日期被保存断为字符串。 但似乎矫枉过正。

关于如何得到这个任何建议设立工作?

支持bean:

@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;
    }
}

谢谢!

Answer 1:

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

这是“形式:位置:验证错误:值无效

当这发生Object#equals()所选项目的测试还没有回到true任何可用的物品。 因此,所选择的Date不匹配任何可用的Date实例。

而事实上,该converter="javax.faces.DateTime"又名<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这个(或更高,约达时间)。

  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" /> </h:selectOneMenu> 

    这样的选项值变为

     <option value="20121227114627792">DATEVALUE1</option> 

    小心时区的问题,当你配置JSF使用的平台特定的时区,而不是GMT为<f:convertDateTime>时区。 你想明确添加timeZone="UTC"属性的转换器即可。



文章来源: JSF 2 - f:selectItems with a Date keyed Map