0

コンポーネントExtendedDataModelClassのデータ ソースとしてSeam の子を使用しようとしています。rich:dataTable

<rich:dataTable id="docPackList" var="pack" width="100%" rows="25"
    value="#{specDocPackageList.dataModel}">
...
</rich:table>

この子のメソッド内で、Seam の から派生したコントローラーのwalkメソッドを呼び出します。このコントローラーには、Seam で注入されたいくつかのフィールドがあります。getResultListEntityQUery

@Name("specDocPackageList")
@Scope(ScopeType.CONVERSATION)
public class SpecDocPackageList extends EntityQuery<DocPackage> {

    @In(create = true, value = "orgunitList")
    private OrgUnitList orgUnitListController;

    public OrgUnitList getOrgUnitListController() {
        return orgUnitListController;
    }

    public void setOrgUnitListController(OrgUnitList orgUnitListController) {
        this.orgUnitListController = orgUnitListController;
    }

    private SelectableQueryDataModel entityQueryDataModel;

    @Override
    public DataModel getDataModel() {
        if (entityQueryDataModel == null) {
            entityQueryDataModel = SelectableQueryDataModel.getInstance(this);
        }
        return entityQueryDataModel;
    }
    ...
}

public class SelectableQueryDataModel<T, K> extends ExtendedDataModel {

    private EntityQuery<T> dataProvider;

    public SelectableQueryDataModel(EntityQuery<T> query) {
        dataProvider = query;
        ...
    }

    public static SelectableQueryDataModel getInstance(EntityQuery query) {
        return new SelectableQueryDataModel(query);
    }

    public void walk(FacesContext facesContext, DataVisitor dataVisitor, Range range, Object o) throws IOException {
        ...
        for (T item : this.dataProvider.getResultList()) {
            ...
        }
        ...
    }
}

問題は、メソッドから呼び出されnullspecDocPackageList.orgUnitListControllerときに私が持っていることです。その時点で例外はスローされません。ただし、 のデータを取得するために が呼び出されると、このフィールドは正しい方法で挿入されます。specDocPackageList.getResultList()SelectableQueryDataModel.walkgetResultList()rich:dataTable

<rich:dataTable id="docPackList" var="pack" width="100%" rows="25"
    value="#{specDocPackageList.resultList}">
...
</rich:table>

なぜ Seam は最初のケースではこのフィールドを挿入せず、2 番目のケースではそれを行わないのですか?

4

1 に答える 1

1

あなたの問題はあなたがあなたEntityQueryのコンストラクタを渡しているという事実によって引き起こされますSelectableQueryDataModel。インターセプトが適切に機能しなかった場合は、コンポーネント参照を保持しないでください。

コンポーネントの名前を渡し、内部から使用Component.getInstance()SelectableQueryDataModelてSeamのインターセプターチェーンを宣伝どおりに機能させることをお勧めします。または、クラスを渡してComponent.getInstance(Class<?>)、要求されたクラスタイプのコンポーネントを取得するために使用することもできます(ただし、後者では、使用するリストごとにEntityQueryをサブクラス化する必要があります)。

于 2012-09-19T16:31:54.747 に答える