3

次のコードは、2つのラジオボタンを作成します。各オプションには、「yyyy-MM-dd」形式のラベルに正常に変換された日付値が含まれています。選択して次のボタンをクリックすると、「j_idt12:comDateChoice:検証エラー:値が無効です」というエラーが表示されます。簡単そうに見えますが、何かがおかしいです。誰かがそれを見つけることができますか?

GlassfishでJSF2.0を使用しています。

バッキングビーン

public List<SelectItem> getComDateList() {
    List<SelectItem> items = new ArrayList<SelectItem>();
    Calendar cal = GregorianCalendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.add(Calendar.MONTH, 1);
    Date nextFirst = cal.getTime();
    cal.add(Calendar.MONTH, 1);
    Date followingFirst = cal.getTime();
    items.add(new SelectItem(nextFirst, new SimpleDateFormat("yyyy-MM-dd").format(nextFirst)));
    items.add(new SelectItem(followingFirst, new SimpleDateFormat("yyyy-MM-dd").format(followingFirst)));
    return items;
}

JSFコード

<h:panelGrid columns="2">
                    <h:outputLabel value="#{msg.FinanceCommencementDate}" for="comDateChoice"/>
                    <h:selectOneRadio id="comDateChoice" value="#{signUpBean.current.commencementDate}" layout="pageDirection">
                        <f:convertDateTime type="date" dateStyle="short"/>
                        <f:selectItems  value="#{signUpBean.comDateList}"/>
                    </h:selectOneRadio>
                </h:panelGrid>
4

1 に答える 1

4

Object#equals()このエラーは、選択したアイテムの値が、使用可能な選択したアイテムの値のいずれのチェックにも合格しなかった場合に発生します。これは、フォーム送信リクエストのリクエスト値の適用フェーズでゲッターがフォームを表示する最初のリクエストとは異なるリストを返した場合に発生する可能性があります。

ビュースコープのBeanのコンストラクターで1回作成するのではなく、ゲッターでリストを再作成しているため、Dateオブジェクトは呼び出しごとに異なるタイムスタンプを取得します。最初のDateオブジェクトと比較して、将来は数分/秒になります。 。したがって、equals()は失敗します。

このロジックをBeanのコンストラクターに移動し、ゲッターを書き直して、本来の機能を実行するようにします。つまり、データのみを返します。ゲッターでロジックのロードを行わないでください。また、フォームを送信するときにコンストラクターが再実行されないように、Beanをビュースコープに配置する必要があります。

@ManagedBean
@ViewScoped
public class SignUpBean {

    private List<SelectItem> comDateList;

    public SignUpBean() {
        comDateList = new ArrayList<SelectItem>();
        // Fill it here.
    }

    public List<SelectItem> getComDateList() {
        return comDateList; // In getters, do nothing else than returning data!
    }

}

更新:コンバーターも問題の潜在的な原因です。基本的に、HTMLページをレンダリングするときに時間を取り除くように指示しました。したがって、に変換するときはデフォルトの時間を使用しますDate。どちらかを使用

<f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss.SSS Z" />

Calendarまたは、事前に時間とタイムゾーンをリセットします。

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.setTimeZone(TimeZone.getTimeZone("GMT"));

このようにあなたはただ使うことができます<f:convertDateTime type="date" />

于 2011-03-23T14:49:05.090 に答える