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