アノテーション型 FacesDataModel
@RetentionSE(RUNTIMESE) @TargetSE(TYPESE) @InheritedSE @Qualifier public @interface FacesDataModel
クラスにこのアノテーションが存在すると、
forClass()属性で示される型をラップできるDataModelとしてクラスがランタイムに自動的に登録されます。Jakarta Faces Specification によって定義された
UIDataおよびその他のコンポーネントが、valueの型に適したDataModelラッパー (アダプター) をランタイムに照会できるように、ランタイムはこれらのDataModelのコレクションを維持する必要があります。これは、SetSE などの特定の型のすべてのラッパーが試行された後で、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