- - PR -
JSFコンバート機能について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-12-27 15:30
現在Java Sun Studio Creatorを利用してJSFの開発を行っています。
JSFのコンバート機能をプルダウンのコンポーネントに利用する際にうまくいきません。 詳細は以下の通りです。 1.画面(JSP)にプルダウンコンポーネントを配置。 2.コンポーネントのプロパティーでCreator標準のintegerConvertを設定 3.インラインメッセージにコンバートのメッセージを出力 このような方法をInputフィールドで実施した際は、期待通りの動作となります。 しかし、プルダウンの場合は、 「 妥当性エラー: {0} 値が無効です 」 というエラーになってしまいます。 プルダウンのデータ構造は以下の通りです。 {"",""} {"1","部署1"} {"2","部署2"} {"3","部署3"} 何か参考になる資料があれば教えてください。 よろしくお願いします。 | ||||
|
投稿日時: 2004-12-27 16:58
「妥当性エラー: {0} 値が無効です」はUISelectOne.validateValueが検知しているのだと思います.
UIInput.validateのjavadocを見ると,validateValueはコンバータによる変換後に呼ばれることが分かります. 次にUISelectOne.validateValueのjavadocを見ると,指定した値が選択肢に一つとequalsかどうか確認することがわかります. つまり,変換後の値とequals比較するので該当する選択肢が無くてエラーになるわけです. コンバータを使わずに,最初からIntegerの選択肢を指定してはどうでしょうか? | ||||
|
投稿日時: 2004-12-27 17:24
ちょっと試してみたらうまくいきました.
jspの方は: <h:selectOneMenu value="#{myBean.number1}"> <f:selectItems value="#{myBean.myList}" /> </h:selectOneMenu> MyBean.javaの方は: protected int num1; public int getNumber1() { return num1; } public void setNumber1(int n) { num1 = n; } public Collection getMyList() { ArrayList l = new ArrayList(); l.add(new SelectItem(new Integer(0), "ZERO")); l.add(new SelectItem(new Integer(1), "ONE")); return l; } | ||||
|
投稿日時: 2004-12-27 17:46
よしだひろゆきさん殿
ありがとうございます。
まったくもってその通りでした。 BeanでInteger型として保持している値をString型でSelectItemにマッピングしていました。 JSFのコンバーターを型のチェック機能と勘違いしていました。 実際はデータの変換(文字通りConvert)しているということですね。 ありがとうございました。 | ||||
|
投稿日時: 2004-12-28 09:10
JSFは,
(1) SelectItemが持っている値をコンバータのgetAsStringで変換してブラウザへ送る (2) 戻ってきた値をコンバータのgetAsObjectで変換する (3) SelectItemが持っている値の一つとequalsかどうか確認する という動きをしますので,getAsStringとgetAsObjectが互換でないとエラーになります. ちなみにDate型に対する標準コンバータはそれらの処理に,DateFormat.formatとDateFormat.parseを使っていますが,これらは必ずしも互換ではないという問題があります. いろいろ試したところ,いったんDateFormat.parseして作ったDateオブジェクトはその後は,formatしてparseすると元に戻るようです. だから,new SelectItem(DateFormat.parse("2004/12/28"))のようにすれば大丈夫でした. |
1