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 メッセージがすべての項目で最初の項目に対して表示されることです。メソッド:

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

問題はどこだ?私にはまったく手がかりがありません

4

2 に答える 2

2

いいもの!

CONVERSION の問題ではなく、VALIDATION エラーが発生している場合、考えられるシナリオは次のとおりです。

  • 使用可能な値のリストが作成され、値の精度は 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>

私のオークションBeanのフラグメント:

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 に答える