- PR -

JSFコンバート機能について

1
投稿者投稿内容
hiro
常連さん
会議室デビュー日: 2004/09/02
投稿数: 21
投稿日時: 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/11/22
投稿数: 141
投稿日時: 2004-12-27 16:58
「妥当性エラー: {0} 値が無効です」はUISelectOne.validateValueが検知しているのだと思います.

UIInput.validateのjavadocを見ると,validateValueはコンバータによる変換後に呼ばれることが分かります.

次にUISelectOne.validateValueのjavadocを見ると,指定した値が選択肢に一つとequalsかどうか確認することがわかります.

つまり,変換後の値とequals比較するので該当する選択肢が無くてエラーになるわけです.

コンバータを使わずに,最初からIntegerの選択肢を指定してはどうでしょうか?
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 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;
}
hiro
常連さん
会議室デビュー日: 2004/09/02
投稿数: 21
投稿日時: 2004-12-27 17:46
よしだひろゆきさん殿
ありがとうございます。
引用:

次にUISelectOne.validateValueのjavadocを見ると,指定した値が選択肢に一つとequalsかどうか確認することがわかります.

つまり,変換後の値とequals比較するので該当する選択肢が無くてエラーになるわけです.



まったくもってその通りでした。
BeanでInteger型として保持している値をString型でSelectItemにマッピングしていました。
JSFのコンバーターを型のチェック機能と勘違いしていました。
実際はデータの変換(文字通りConvert)しているということですね。

ありがとうございました。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)