我正在尝试使用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()) {
...
}
...
}
}
问题是null
从specDocPackageList.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不会在第一种情况下注入此字段并在第二种情况下执行此操作?
答案 0 :(得分:1)
您的问题是由于您在EntityQuery
的构造函数中传递SelectableQueryDataModel
这一事实造成的。如果拦截无法正常工作,则不应该保留组件引用。
你最好传递组件的名称,并使用Component.getInstance()
内的SelectableQueryDataModel
来使Seam的拦截链工作正如所宣传的那样。或者,您可以传递该类并使用Component.getInstance(Class<?>)
来检索所请求的类类型的组件(后者需要为您使用的每个列表创建子类的EntityQuery。)