「検証エラー:値は有効ではない」Fからのエラー:DateTimeConverter
-
29-10-2019 - |
質問
次のコードでは、2つのラジオボタンが作成されます。各オプションには、フォーマット「yyyy-mm-dd」のラベルに正常に変換される日付値が含まれています。選択を行い、次のボタンをクリックしたら、次のエラー「J_IDT12:comdateChoice:検証エラー:値が有効ではない」を取得します。簡単に思えますが、何かが間違っています。誰もそれを見つけることができますか?
GlassfishでJSF 2.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>
解決
選択したアイテムの値が合格しなかった場合、このエラーは発生します Object#equals()
使用可能な選択アイテム値のいずれかを確認します。これは、フォームのリクエストリクエストの適用要求値フェーズ中に、フォームを表示する最初のリクエスト中に行った場合よりも、Form送信要求のリクエスト値フェーズ中に別のリストを返した場合に発生する可能性があります。
ビュースコープ豆のコンストラクターに一度構築する代わりに、ゲッターのリストを再構築しているので、 Date
オブジェクトはすべての呼び出しで異なるタイムスタンプを取得します。初期と比較して、将来は数分/秒になります Date
オブジェクト。従って equals()
失敗します。
このロジックを豆のコンストラクターに移動し、ゲッターを書き直して、それが想定されることを行うようにします。 データのみを返します. 。ゲッターにロジックを読み込まないでください。また、フォームを送信したときにコンストラクターが再実行されないように、ビーンをビュースコープに入れてください。
@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"));
これにより、aだけを使用できます <f:convertDateTime type="date" />