Validation JSF convertDateTime验证错误
我在主题中提到了一个问题。我有Validation JSF convertDateTime验证错误,validation,jsf,methods,Validation,Jsf,Methods,我在主题中提到了一个问题。我有 <h:selectOneMenu class="time" id="time" value="#{auctionBean.expDate}"> <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/> <f:selectItem itemVa
<h:selectOneMenu class="time" id="time" value="#{auctionBean.expDate}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
<f:selectItem itemValue="11/11/1111 11:11:11" itemLabel="1 day" />
<f:selectItem itemValue="#{auctionBean.calculateExpDate(4)}" itemLabel="4 days" />
<f:selectItem itemValue="#{auctionBean.calculateExpDate(7)}" itemLabel="7 days" />
<f:selectItem itemValue="#{auctionBean.calculateExpDate(14)}" itemLabel="14 days" />
</h:selectOneMenu>
它以良好的格式返回字符串。system.out的输出:
INFO: data: 10/10/2013 20:40:04
问题在哪里?我一点线索都没有一个好的
如果您得到的是验证错误,而不是转换问题,那么可能的情况是:
- 将创建可用值列表,这些值的精度为1秒
- 用户选择其中一个
- 但是回发时,可用值会重新计算,并且它们都比原始值晚了几秒钟
- 因此,用户选择的值在可能值列表中不再可用
- 因此会发生验证错误(当所选的值不再在选择项列表中时,JSF总是这样做)
- 您无法从第一项获得它,因为它是唯一不随时间变化的项
如果您将支持bean移动到视图范围(或会话范围),或者降低精度,那么它应该可以工作。或者更好-使用NOW、IN_2_DAYS、IN_4_DAYS等值创建一个枚举。并在选择枚举后计算实际日期。fdreger是正确的!我在他的帖子上做了记号作为回答。谢谢:) 如果您懒惰,这是我的解决方案(不过我想这可能会做得更好): JSF: 用户选择他的拍卖应该活跃多少天,我计算到期日期。
expDate是一个日期对象,在选择单个枚举并对表单进行sumbit之后,我只设置了一次。非常好的解决方案建议:)我将继续使用枚举,并仅在选择后进行计算。您可以通过将
calculateExpDate
逻辑放入枚举本身来改进它。然后你只需要做expDate=chosenOption.calculateExpDate()
。你总是对的巴卢斯:)我编辑了这篇文章
INFO: data: 10/10/2013 20:40:04
<h:selectOneMenu class="time" id="time" value="#{auctionBean.choosenOption}">
<f:selectItems value="#{auctionBean.days}" var="days" itemValue="#{days}" itemLabel="#{days.label}"/>
</h:selectOneMenu>
public enum Days {
IN_1_DAY("1 dzień", 1),
IN_4_DAYS("4 dni", 4),
IN_7_DAYS("7 dni", 7),
IN_14_DAYS("14 dni", 14);
private String label;
private int days;
private Days(String label, int days) {
this.label = label;
this.days = days;
}
public String getLabel() {
return label;
}
public Date calculateExpDate() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, this.days);
return cal.getTime();
}
}
private Days choosenOption;
public void setChoosenOption(Days choosenOption) {
this.choosenOption = choosenOption;
expDate = choosenOption.calculateExpDate();
}
public Days getChoosenOption() {
return choosenOption;
}
public Days[] getDays() {
return Days.values();
}