- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的 selectItems 来自 Session Scoped Map。当用户单击“提交”按钮时,应该在 Request Scoped backing 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 转换器,但随后收到了一个更神秘的验证错误。
找到 a post这建议检查 equal() 方法是否可用,以及项目选择是否在下拉列表中,在这种情况下两者都应该为真。
我能想到的一个解决方法是将我的 map 更改为字符串键控,其中日期被保存为字符串。但这似乎有点矫枉过正。
关于如何让这个设置工作的任何建议?
支持 bean:
@Named
@RequestScoped
public class DropDown {
private Date selectedDate;
public Date getSelectedDate() {
return selectedDate;
}
public void setSelectedDate(Date selectedDate) {
this.selectedDate = selectedDate;
}
}
map bean :
@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;
}
}
谢谢!
最佳答案
使用日期时间转换器应该是正确的解决方案。你的“更神秘的验证错误”原来是这样的:
It was "form:location: Validation Error: Value is not valid
这将在 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
虽然 map 中提供的日期显然时间部分仍然设置,导致 equals()
总是失败,除非可用日期的 map 恰好在 00:00:00.000
生成午夜。
这个问题有两种解决方案:
删除映射中日期的时间部分。您可以使用 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" />
</h:selectOneMenu>
这样选项值就变成了
<option value="20121227114627792">DATEVALUE1</option>
当您将 JSF 配置为使用平台特定时区而不是 GMT 作为 <f:convertDateTime>
时,请注意时区问题。时区。您想明确添加 timeZone="UTC"
然后属性给转换器。
关于java - JSF 2 - f :selectItems with a Date keyed Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14046309/
我是一名优秀的程序员,十分优秀!