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();
}