2

我想将排序添加到 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 吗?

4

3 回答 3

2

首先,与您的问题没有直接关系,但是:您永远不应该将您的业务方法放入组件获取器中(即使使用空检查,我认为这是一种不好的做法)。请改用 @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 {
    ...
}
于 2012-09-02T05:54:47.057 回答
1

@ViewScopedCDI 不支持,所以如果你需要@ViewScoped在 CDI 中使用,你应该

  • 使用seam-facesMyFaces CODI模块。只需将其中一个添加到您的类路径中即可@ViewScoped在 CDI 中工作。MyFaces CODI 对@ViewScoped 的支持更加稳固
  • 使用 MyFaces CODI's @ViewAccessScoped,它是 Apache 在 CDI 之上编写的扩展,只需下载它并使用@ViewAccessScoped注释而不是@ViewScoped.
  • 使用 CDI@ConversationScoped并使其长期运行。请参阅此处了解更多信息

不幸的是,seam3 解决方案存在内存泄漏问题,所以不要使用 seam3 解决这个特殊问题,更好的解决方案是 CODIs @ViewAccessScoped

请参阅:ViewScoped bean 的内存泄漏?

于 2012-09-01T18:48:40.903 回答
0

你需要使用这个 Annotation Bean 组合:

对于@ManagedBean,您需要使用@ViewScoped

对于@Named (CDI) 你需要使用@ConversationScoped

于 2016-07-27T08:49:35.493 回答