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