Java 惰性加载时PrimeFaces数据表中的奇怪行为(视频内部;)
晚上好,来自德国 PrimeFaces DataTable组件有一个非常奇怪的行为: 我有一个简单的pojo、一个从DB中取出pojo的EJB、一个用于JSF页面的控制器和一个从Primefaces实现LazyDataModel的CDIBean。一切正常。站点之间的分页工作正常,过滤器和排序也正常。但是,当我使用ActionListener单击DataTable行中的按钮时,一切都停止工作。在我重新加载页面之前,分页不起作用(尽管请求/响应已经完成…非常奇怪) 为了更好地理解,我制作了一个小视频: 我想,EJB调用一定是问题所在,但我错了。我用一个简单的ArrayList创建了一个小的(非常快速和肮脏的;)示例,我能够重现这个示例(Primefaces 4.0.x和Primefaces 5-Snapshot): 首先,我的POJO: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行中的按钮时,一切都停止工作。在我重新加载页面之前,分页不起作用(尽管请求/响应已经完成…非常奇怪) 为了更好地理解,我制作了一个小视频
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跳转到我在表请求之前单击的页面。