パッケージ jakarta.faces.model

アノテーション型 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 Bclass A extends Bclass Q が与えられた場合、2 つの可能なオーダーは次のとおりです。

    1. {A, B, Q}
    2. {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"

    • オプション要素のサマリー

      オプション要素  
      修飾子と型 オプションの要素 説明
      ClassSE<?>forClass
      このアノテーション属性の値は、このアノテーションでアノテーションが付けられた DataModel がラップできる型であると見なされます。
    • 要素の詳細

      • forClass

        ClassSE<?> forClass

        このアノテーション属性の値は、このアノテーションでアノテーションが付けられた DataModel がラップできる型であると見なされます。

        戻り値:
        このアノテーションが付けられた DataModel がラップできる型
        デフォルト:
        java.lang.Object.class