使用日期时间转换器应该是正确的解决方案。您的“更多神秘验证错误”原来是这样的:
它是“ 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-2700:00:00.000显然仍设置了时间部分的情况,这导致
equals()总是失败,除非可用日期的地图是由巧合产生的正是
00:00:00.000午夜。
有2个解决此问题的方法:
删除映射中日期的时间部分。您可以使用
java.util.Calendar
它(或者更好的是Joda Time)。改用
<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" />



