JSF convertDateTime验证错误

时间:2013-09-26 18:47:23

标签: validation jsf methods

我在主题中提到了一个问题。我有

    <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>

问题是我收到验证错误:除了第一个,所有项目的值都无效。 方法:

public String calculateExpDate(int days) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.DATE, days);
    Format formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    System.out.println("data: " + formatter.format(cal.getTime()));
    return formatter.format(cal.getTime());
}

以良好的格式返回String。 system.out的输出:

INFO:   data: 10/10/2013 20:40:04

问题出在哪里?我根本不知道

2 个答案:

答案 0 :(得分:2)

一个好人!

如果你得到的是VALIDATION错误,而不是CONVERSION问题,那么可能的情况是:

  • 创建可用值列表,值的精度为1秒
  • 用户选择其中一个,
  • 在回发时
  • 重新计算可用值,并且它们都比原始值几秒钟
  • 因此,用户在可能的值列表中选择的值不再可用
  • 因此发生了验证错误(当选择的值不再出现在选择项列表中时,JSF始终会这样做。)
  • 你没有得到第一项,因为它是唯一一个不随时间变化的: - )。

如果您将支持bean移动到查看范围(或会话范围),或者削减精度,它应该可以工作。或者更好的是 - 使用NOW,IN_2_DAYS,IN_4_DAYS等值创建枚举。并在选择枚举后计算实际日期。

答案 1 :(得分:1)

fdreger是对的!我把他的帖子标记为答案。谢谢:) 如果你是懒惰的话,这是我的解决方案(不过我认为可能做得更好):

JSF:

<h:selectOneMenu class="time" id="time" value="#{auctionBean.choosenOption}">
                                <f:selectItems value="#{auctionBean.days}" var="days" itemValue="#{days}" itemLabel="#{days.label}"/>
                            </h:selectOneMenu>
我的auctionBean的

片段:

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

用户选择他的拍卖应该活动多少天,我计算什么是到期日。 expDate是Date对象,在我选择单个枚举和sumbitting表单后,我只设置了一次。非常好的解决方案建议:)