0

我正在尝试使用 Seam 的一个孩子ExtendedDataModelClass作为rich:dataTable组件的数据源:

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

在这个孩子的walk方法中,我调用了getResultList从 Seam 派生的控制器方法EntityQUery。这个控制器有一些用 Seam 注入的字段:

@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.walk那时不会抛出任何异常。getResultList()但是,当被调用以获取以下数据时,该字段以正确的方式注入rich:dataTable

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

为什么Seam不在第一种情况下注入这个字段而在第二种情况下这样做呢?

4

1 回答 1

1

您的问题是由于您EntityQuery传入SelectableQueryDataModel. 你不应该保留组件引用,如果你做拦截不能正常工作。

您最好传递组件的名称并Component.getInstance()从内部使用,SelectableQueryDataModel以使 Seam 的拦截器链像宣传的那样工作。或者,您可以传递该类并使用它Component.getInstance(Class<?>)来检索所请求的类类型的组件(但后者要求您使用的每个列表都对 EntityQuery 进行子类化)。

于 2012-09-19T16:31:54.747 回答