我想在PrimeFaces 3.3 dataTable中添加排序,并创建了以下ViewScoped bean,它存储了列表,因此不会一直从EJB中获取它:
@Named
@ViewScoped
public class CustomerList implements Serializable {
private static final long serialVersionUID = 6168621124401208753L;
@EJB
CustomerEJB customerBean;
List<Customer> allCustomers = null;
public void loadCustomerList() {
allCustomers = customerBean.findAll();
}
public List<Customer> getList() {
if (allCustomers == null) {
loadCustomerList();
}
return allCustomers;
}
}
这是使用bean的视图:
<ui:composition template="/WEB-INF/templates/template.xhtml">
<ui:define name="content">
<h:form id="customerList">
<p:dataTable id="customer" var="customer"
value="#{customerList.list}" sortBy="#{customer.id}"
paginator="true" rows="10" paginatorAlwaysVisible="false"
paginatorPosition="top">
<p:column sortBy="#{customer.id}">
<f:facet name="header">
<h:outputText value="#{msg.customerIdLabel}" />
</f:facet>
<h:outputText value="#{customer.id}" />
</p:column>
<p:column sortBy="#{customer.lastName}">
<f:facet name="header">
<h:outputText value="#{msg.customerLastNameLabel}" />
</f:facet>
<h:outputText value="#{customer.lastName}" />
</p:column>
问题是我可以单击列标题进行排序,但表格仍未排序,即使初始排序不起作用。当你在getList()方法中设置断点时,我可以看到在处理请求期间从EJB中多次提取该列表。 只要视图由ViewScope激活,是否应该存储bean?
答案 0 :(得分:2)
首先,与您的问题没有直接关系,但是: 你永远不应该将你的业务方法放入组件getter中(即使使用null检查我认为这是一个不好的做法)。请改用@PostConstruct注释:
@PostConstruct
public void loadCustomerList() {
allCustomers = customerBean.findAll();
}
public List<Customer> getList() {
return allCustomers;
}
每次构造ViewScoped bean时都会调用loadCustomerList。 另外,检查您的导入范围注释:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
最后你的课应该是这样的:
@ViewScoped
@ManagedBean
public class CustomerList implements Serializable {
...
}
答案 1 :(得分:1)
@ViewScoped
如果您需要在CDI中使用@ViewScoped
,那么
@ViewScoped
将在CDI中工作。 MyFaces CODI对@ViewScoped @ViewAccessScoped
,它是Apache在CDI之上编写的扩展,只是download它并使用@ViewAccessScoped
注释而不是@ViewScoped
。@ConversationScoped
并使其长时间运行。见here for more info。不幸的是,seam3解决方案存在内存泄漏问题,所以不要使用seam3来解决这个特殊问题,更好的解决方案是CODI @ViewAccessScoped
。
答案 2 :(得分:0)
您需要使用此注释Bean组合:
对于@ManagedBean你需要使用@ViewScoped
对于@Named(CDI),你需要使用@ConversationScoped