カスタム クラス オブジェクトをチェックボックス/コンボなどの MyFaces UI コンポーネントと一緒にバインドしようとしていますが、バッキングでゲッター/セッターを作成することにより、int/float/boolean/String/List<String> のような明示的な型を指定しません。豆。
したがって、私の場合、通常は次のようになります。
<h:selectOneListbox id="mylist" value="#{bean.myListValueHolder.data}"
converter="myValueConverter">
...
</h:selectOneListbox>
どこ:
- ビーンはバッキングビーンです
- myListValueHolder は MyValueHolder<T> 型です
- データは <T> 型です
カスタム コンバーター とこのクラス シグネチャを使用しようとしています。
public class MyValueHolder<T extends Comparable<T>> extends Node<T> {
....
MyValueHolder には次のメソッドがあります。
public T getData() {
...
public void setData(Object data) {
...
public void setData(T data) {
...
私のコンバーター:
public Object getAsObject(FacesContext fc, UIComponent c, String value) {
...
問題:実行時に値として渡された型<T>をどのように見つけることができますか? 私の場合、boolean、int、float、double、String、または List<String> にすることができます。
でも書くのはちょっと苦手
- 多くの「型へのキャストを試み、それが成功した場合、その型はあなたの型です」が、それが int か float/double かはわかりません。
- h:selectOneListbox を定義するときに、型をパラメーターまたは 2 番目のパラメーターとして指定する
- ???
どうすればこれを達成できますか?
編集: OK、リストは機能しません。しかし問題は、バッキング Bean の多くの単純な「ダミー」ゲッター/セッターへの書き込みを避けるために、私のビューで JSF UIComponents の値をある種の値ラッパーにバインドすることは良いことでしょうか?
したがって、「bean.get('property_name')」または「#{bean.myListValueHolder.data}」または同様の構文のように、Key (文字列であるプロパティ名) によって MyValueHolder にアクセスできる「1 つの」Bean を使用できます。 ?
EDIT2 : BalusC の質問に答え、その理由を説明します。
今のところ、このアプローチが良いものかどうかはわかりません。
私のデータは XML として提供されます。それを解析してkey
、value
ペアとして保存します。私の UI 要素には、特定state
の (s) ( State
-Enum {hidden、visible、disabled、enabled、hover、focus、active、...} からの EnumSet もあり、に格納されている特定の値に依存していValueHolders
ます。必要なState
( s) はRule
クラスで記述されており、EnumSet
ofState
とmatches
メソッドがあり、一致したためtrue
に定義済みが適用されるかどうかをState
返します。その一致に関連付けられた。Rule
ValueChangedListeners
State
Value
Rules
Value
少なくともこれは私が考えた方法です、私はこれを行うことができます。したがって、ビューから値と ui-state を照会できます。具体的な値が変更された場合はState
、UIComponent
コールバックを呼び出してState
、新しい css クラスをその特定のコンポーネントに追加/削除することができます。 Jクエリ。
まあ、ちょっと複雑またはかなりやり過ぎに聞こえますが、Java で UI コンポーネントを定義したいStates
ので、Java からも変更できState
、ビューで State-Rules が定義されていません。