アノテーション型 FacesDataModel
@RetentionSE(RUNTIMESE) @TargetSE(TYPESE) @InheritedSE @Qualifier public @interface FacesDataModel
クラスにこのアノテーションが存在すると、
forClass()
属性で示される型をラップできるDataModel
としてクラスがランタイムに自動的に登録されます。Jakarta Faces Specification によって定義された
UIData
およびその他のコンポーネントが、value
の型に適したDataModel
ラッパー (アダプター) をランタイムに照会できるように、ランタイムはこれらのDataModel
のコレクションを維持する必要があります。これは、Set
SE などの特定の型のすべてのラッパーが試行された後で、ScalarDataModel
がラッパーとして選択される前に実行する必要があります。UIData.getValue()
を参照してください。このクエリは次のように機能する必要があります。
UIData
コンポーネント、またはDataModel
を利用する Jakarta Faces Specification によって定義されたその他のコンポーネントにバインドされている型Z
のインスタンスの場合、その型のクエリは、Z
をラップできる最も具体的な DataModel を返す必要があります。この最も具体的な DataModel は、登録された
DataModels
が格納されているコレクションを最初にソートし (このソートの詳細については以下を参照)、ソートされたコレクションを最初から最後まで繰り返し、この反復を停止することによって取得される DataModel として定義されます。DataModel によってラップされたクラスZZ
の場合(forClass()
属性によって示される)、そのZZ.isAssignableFrom(Z)
を保持する最初の一致。この一致は、最も具体的な DataModel と見なされます。ソートは次のように実行する必要があります。
上記のコレクションに格納されている DataModel によってラップされたクラスでソートします。このコレクションの任意の 2 つのクラス
X
およびY
について、X
のオブジェクトがinstanceof
である場合、Y
のオブジェクト、X
はY
の前にコレクションに表示されます。それ以外の場合、コレクションのソートは任意です。つまり、サブクラスはスーパークラスの前に来ます。例:
class B
、class A extends B
、class Q
が与えられた場合、2 つの可能なオーダーは次のとおりです。{A, B, Q}
{Q, A, B}
ここの唯一の要件は
A
がB
の前に現れるということです、A
がB
のサブクラスであるため。この仕様では、「特定の型の最も具体的な DataModel」のインスタンスを取得するための public メソッドは定義されていません。このようなインスタンスは、次のようなコードを使用して取得できます。
@SuppressWarnings("unchecked") public <T> DataModel<T> createDataModel(Class<T> forClass, Object value) { class LocalUIData extends UIData { @Override public DataModel<?> getDataModel() { return super.getDataModel(); } } LocalUIData localUIData = new LocalUIData(); localUIData.setValue(value); return (DataModel<T>) localUIData.getDataModel(); }
例:
public class Child1 { }
package test.faces23; @FacesDataModel(forClass = Child1.class) public class Child1Model<E> extends DataModel<E> { @Override public int getRowCount() { return 0; } @Override public E getRowData() { return null; } @Override public int getRowIndex() { return 0; } @Override public Object getWrappedData() { return null; } @Override public boolean isRowAvailable() { return false; } @Override public void setRowIndex(int arg0) { } @Override public void setWrappedData(Object arg0) { } }
次に、以下が機能する必要があります。
DataModel<Child1> myModel = createDataModel(Child1.class, new Child1()); assert myModel instanceof Child1Model; System.out.println(myModel.getClass());
出力される結果は、例:
"class test.faces23.Child1Model"
要素の詳細
forClass
ClassSE<?> forClass
このアノテーション属性の値は、このアノテーションでアノテーションが付けられた DataModel がラップできる型であると見なされます。
- 戻り値:
- このアノテーションが付けられた DataModel がラップできる型
- デフォルト:
- java.lang.Object.class