Seam组件未在ExtendedDataModel子项中注入

时间:2012-09-19 12:10:36

标签: java jsf dependency-injection richfaces seam

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

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

在这个孩子的walk方法中,我调用了一个从Seam的getResultList派生的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> 的数据时,会以正确的方式注入此字段:

{{1}}

为什么Seam不会在第一种情况下注入此字段并在第二种情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

您的问题是由于您在EntityQuery的构造函数中传递SelectableQueryDataModel这一事实造成的。如果拦截无法正常工作,则不应该保留组件引用。

你最好传递组件的名称,并使用Component.getInstance()内的SelectableQueryDataModel来使Seam的拦截链工作正如所宣传的那样。或者,您可以传递该类并使用Component.getInstance(Class<?>)来检索所请求的类类型的组件(后者需要为您使用的每个列表创建子类的EntityQuery。)