Java 惰性加载时PrimeFaces数据表中的奇怪行为(视频内部;)

Java 惰性加载时PrimeFaces数据表中的奇怪行为(视频内部;),java,jakarta-ee,jsf-2,primefaces,datatable,Java,Jakarta Ee,Jsf 2,Primefaces,Datatable,晚上好,来自德国 PrimeFaces DataTable组件有一个非常奇怪的行为: 我有一个简单的pojo、一个从DB中取出pojo的EJB、一个用于JSF页面的控制器和一个从Primefaces实现LazyDataModel的CDIBean。一切正常。站点之间的分页工作正常,过滤器和排序也正常。但是,当我使用ActionListener单击DataTable行中的按钮时,一切都停止工作。在我重新加载页面之前,分页不起作用(尽管请求/响应已经完成…非常奇怪) 为了更好地理解,我制作了一个小视频

晚上好,来自德国

PrimeFaces DataTable组件有一个非常奇怪的行为:

我有一个简单的pojo、一个从DB中取出pojo的EJB、一个用于JSF页面的控制器和一个从Primefaces实现LazyDataModel的CDIBean。一切正常。站点之间的分页工作正常,过滤器和排序也正常。但是,当我使用ActionListener单击DataTable行中的按钮时,一切都停止工作。在我重新加载页面之前,分页不起作用(尽管请求/响应已经完成…非常奇怪)

为了更好地理解,我制作了一个小视频:

我想,EJB调用一定是问题所在,但我错了。我用一个简单的ArrayList创建了一个小的(非常快速和肮脏的;)示例,我能够重现这个示例(Primefaces 4.0.x和Primefaces 5-Snapshot):

首先,我的POJO:

public class User {
  private String login;
  private Date removeDate;

  public String getLogin() {
    return login;
  }

  public void setLogin(String login) {
    this.login = login;
  }

  public Date getRemoveDate() {
    return removeDate;
  }

  public void setRemoveDate(Date removeDate) {
    this.removeDate = removeDate;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof User)) return false;

    User user = (User) o;

    if (!login.equals(user.login)) return false;

    return true;
  }

  @Override
  public int hashCode() {
    return login.hashCode();
  }
}
非常简单的ControllerBean与LazyLoad方法和操作:

@Named
@SessionScoped
public class LazyUserBean implements Serializable {

  private List<User> userEntityList = new ArrayList<>();

  @PostConstruct
  public void init() {
    for (int i = 0; i < 100; i++) {
      User newUser = new User();
      newUser.setLogin("User " + i);
      newUser.setRemoveDate(new Date());

      userEntityList.add(newUser);
    }
  }

  public List<User> getAllEntitiesLazy(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters, boolean invalidate) {
    List<User> returnList = new ArrayList<>();

    for (int i = first; i < this.userEntityList.size(); i++) {
      returnList.add(this.userEntityList.get(i));
    }
    return returnList;
  }

  public void removeDelDate(User user) {
    user.setRemoveDate(null);
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
        Environment.getMessageResourceString("de.flatphormesmedia.wbsagentur.resources.lang_de", "persistence.recycleSuccess", new String[]{"bla"}), ""));
  }
}
@Named
@会议范围
公共类LazyUserBean实现了可序列化{
private List userEntityList=new ArrayList();
@施工后
公共void init(){
对于(int i=0;i<100;i++){
User newUser=新用户();
newUser.setLogin(“用户”+i);
setRemoveDate(新日期());
userEntityList.add(新用户);
}
}
公共列表GetAllentiesLazy(int-first、int-pageSize、字符串排序字段、排序器排序器、映射筛选器、布尔无效){
List returnList=new ArrayList();
for(int i=first;i
LazyLoadModel实现:

@Named
@ViewScoped
public class LazyUserModel extends LazyDataModel<User> implements Serializable {
  private List<User> datasource;

  @Inject
  LazyUserBean lazyUserBean;

  @Override
  public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
    this.datasource = this.lazyUserBean.getAllEntitiesLazy(first, pageSize, sortField, sortOrder, filters, true);
    this.setRowCount(100);

    return datasource;
  }

  @Override
  public Object getRowKey(User user) {
    return user.getLogin();
  }
}
@Named
@视域
公共类LazyUserModel扩展LazyDataModel实现可序列化{
私有列表数据源;
@注入
懒虫豆懒虫豆;
@凌驾
公共列表加载(int-first、int-pageSize、字符串排序字段、排序器排序器、映射过滤器){
this.datasource=this.lazyUserBean.GetAllentiesLazy(第一个,pageSize,sortField,sortOrder,filters,true);
这个.setRowCount(100);
返回数据源;
}
@凌驾
公共对象getRowKey(用户){
返回user.getLogin();
}
}
最后是JSF页面:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.org/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://primefaces.org/ui ">
<h:head>
</h:head>
<h:body>
    <h:form id="formEditUsers">
        <p:dataTable value="#{lazyUserModel}" var="user" lazy="true" paginator="true"
                     rows="13" id="tableUsers" emptyMessage="#{langRes['editUsers.emptyTable']}"
                     paginatorPosition="top">
            <!-- user login column -->
            <p:column headerText="#{langRes['editUsers.colHeadLogin']}" id="columnLogin"
                      filterBy="#{user.login}"
                      sortBy="#{user.login}">
                <p:outputLabel id="labelLogin" value="#{user.login}"/>
            </p:column>
            <!--delete date column-->
            <p:column headerText="#{langRes['setupAddresses.colHeadDeleteDate']}" id="columnDeletedDate"
                      width="20%">
                <p:outputLabel id="labelDeletedDate" value="#{user.removeDate}">
                    <f:convertDateTime pattern="dd.MM.yyyy - HH:mm:ss"/>
                </p:outputLabel>
            </p:column>

            <!-- edit column -->
            <p:column id="columnEdit" width="10%" style="text-align: center">
                <p:commandButton actionListener="#{lazyUserBean.removeDelDate(user)}"
                                 update=":formEditUsers:tableUsers"
                                 process="@this" id="buttonRecycle" icon="ui-icon-arrowreturnthick-1-w"
                                 style="height: 70% !important">
                </p:commandButton>
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

就像我说的,很快又脏…但这里没什么特别的。从上周六开始我就快发疯了。我在这里做错了什么?或者这是一个PrimeFaces Bug?真不敢相信,我是第一个发现这种行为的人。 提前谢谢


更新1:我在CommandButton中添加了ajax=“false”属性,在完整的请求下,它就像一个符咒。按钮有什么问题吗?

我以前从未见过懒散的数据模型也是托管bean。您的代码看起来不错,因此您可能应该尝试将模型和bean划分为不同的类。

请尝试process=“:formEditUsers:tableUsers”而不是process=“@this”

这是一个primefaces错误。r11009()已修复。

谢谢您的回答。。。我马上就试了…但结果一样。谢谢!几天前我也这么想……但这并没有改变什么。奇怪的是,我设置了一个按钮并发出请求,在分页之后,datatable跳转到我在表请求之前单击的页面。