java - Seam 组件不会注入(inject)到 ExtendedDataModel 子级中

标签 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>

在这个 child 的walk方法中,我调用了从Seam的EntityQUery派生的 Controller 的getResultList方法。该 Controller 有一些用 Seam 注入(inject)的字段:

@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()) {
            ...
        }
        ...
    }
}

问题是当从 SelectableQueryDataModel.walk< 调用 specDocPackageList.getResultList() 时,我在 specDocPackageList.orgUnitListController 中有 null/ 方法。此时不会引发任何异常。但是,当调用 getResultList() 来获取 rich:dataTable 的数据时,会以正确的方式注入(inject)该字段:

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

为什么 Seam 不在第一种情况下注入(inject)该字段,而在第二种情况下注入(inject)该字段?

最佳答案

您的问题是由于您正在通过 EntityQuery 引起的在 SelectableQueryDataModel 的构造函数中。如果拦截无法正常工作,则不应保留组件引用。

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

关于java - Seam 组件不会注入(inject)到 ExtendedDataModel 子级中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494444/

相关文章:

java - 通过套接字将数据从 C++ 程序移植到 Java 程序的输入是否比通过服务器上的原始 json 或 xml 文件更快?

java - Primefaces p :poll tag

dependency-injection - 减少依赖数量的好方法是什么?

java - 在方法之前和之后执行代码?

java - RankingMetrics 类的指标,Spark

java - @Autowired 和 TransactionProxyFactoryBean?

java - 在 jsf 标签内调用 if 函数两次

去和 Gin : Passing around struct for database context?

java - 在 Ubuntu 服务器中设置 JAVA_HOME 环境变量的官方方法?

java - 保存拖放位置primfaces