gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:09:45 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com