1

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

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

问题是我收到 Validation Error: Value is not valid message for all items but first one。方法:

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

它以良好的格式返回字符串。system.out 的输出:

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

哪里有问题?我一点头绪都没有

4

2 回答 2

2

一个好!

如果您得到的是验证错误,而不是转换问题,那么可能的情况是:

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

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

于 2013-09-26T18:51:44.967 回答
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>

我的拍卖豆片段:

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 对象,在选择单个枚举并提交表单之后。建议很好的解决方案:)

于 2013-09-26T19:53:51.690 回答