@RetentionSE(valueSE=RUNTIMESE) @TargetSE(valueSE=TYPESE) @InheritedSE @Qualifier public @interface FacesDataModel
クラスにこのアノテーションが存在すると、forClass()
属性で示される型をラップできる DataModel
としてクラスがランタイムに自動的に登録されます。
ランタイムは、UIData
および Jakarta Server Faces 仕様で定義された他のコンポーネントが、value
の型に適した DataModel
ラッパー(アダプター)をランタイムに照会できるように、これらの DataModel
のコレクションを維持する必要があります。これは、Set
SE などの特定の型のすべてのラッパーが試行された後、ただし ScalarDataModel
がラッパーとして選択される前に実行する必要があります。UIData.getValue()
を参照してください。
このクエリは次のように機能する必要があります。
UIData
コンポーネントまたは DataModel
を利用する Jakarta Server Faces 仕様で定義された他のコンポーネントにバインドされている型 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"
public abstract ClassSE<?> forClass
このアノテーション属性の値は、このアノテーションでアノテーションが付けられた DataModel がラップできる型であると見なされます。
Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.