[英]lazy datatable's rowselect event object is always null
I'm trying to use the p:datatable
to list a previously search result and then select a row to get displayed on a show dialog (as shown in showcase, http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml ). 我正在尝试使用p:datatable
列出以前的搜索结果,然后选择要在显示对话框中显示的行(如showcase所示, http://www.primefaces.org/showcase/ui/data/ datatable / lazy.xhtml )。 But SelectEvent.getObject()
of ajax event "rowSelect" returns always null
and current row is never selected. 但是ajax事件“rowSelect”的SelectEvent.getObject()
返回始终为null
并且永远不会选择当前行。
This is the stack trace: 这是堆栈跟踪:
Caused by: java.lang.NullPointerException
at com.gestion.projet.web.jsf.ProjetComponentImpl.onRowSelect(ProjetComponentImpl.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy58.onRowSelect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy10.onRowSelect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
... 38 more
This is my xhtml file: 这是我的xhtml文件:
<p:dataTable var="current" value="#{ProjetComponent.lazyModel}"
paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="5,10,15" selectionMode="single"
selection="#{ProjetComponent.projet}" id="projetTable" lazy="true">
<p:ajax event="rowSelect" listener="#{ProjetComponent.onRowSelect}"
update=":form:projetDetail" oncomplete="PF('projetDialog').show()" />
<p:column headerText="Id" sortBy="#{current.idprojet}" filterBy="#{current.idprojet}">
<h:outputText value="#{current.idprojet}" />
</p:column>
<p:column headerText="Nom" sortBy="#{current.nomprojet}"
filterBy="#{current.nomprojet}">
<h:outputText value="#{current.nomprojet}" />
</p:column>
</p:dataTable>
And this is the method onRowSelect
on ProjetComponent
who contain the line 92: 这是包含第92行的onRowSelect
上的ProjetComponent
方法:
@Scope("session")
@Component("ProjetComponent")
public class ProjetComponentImpl implements ProjetComponent {
private Projet projet;
@Autowired
private ProjetService projetService;
private LazyDataModel<Projet> lazyModel;
/**
*/
public ProjetComponentImpl() {
}
@PostConstruct
public void init() {
//initialize the data here
this.phases = new Phase();
//similar for other fields
this.utilisateurs =new Utilisateur();
this.projet=new Projet();
this.lazyModel = new LazyProjetDataModel(projetService.findAllProjets(-1, -1));
}
@Transactional
public LazyDataModel<Projet> getLazyModel() {
this.lazyModel = new LazyProjetDataModel(projetService.findAllProjets(-1, -1));
return lazyModel;
}
@Transactional
public void setLazyModel(LazyDataModel<Projet> lazyModel) {
this.lazyModel = lazyModel;
}
@Transactional
public void onRowSelect(SelectEvent event) {
if (event != null){
FacesMessage msg = new FacesMessage("Projet Selected", ((Projet) event.getObject()).getIdprojet().toString());//Line 92
FacesContext.getCurrentInstance().addMessage(null, msg);
} }
}
and this the LazyProjetDataModel
: 这就是LazyProjetDataModel
:
public class LazyProjetDataModel extends LazyDataModel<Projet> {
private static final long serialVersionUID = 1L;
private List<Projet> datasource;
public LazyProjetDataModel(List<Projet> datasource) {
this.datasource = datasource;
}
@Override
public Projet getRowData(String rowKey) {
for(Projet projet : datasource) {
if(projet.getIdprojet().equals(rowKey))
return projet;
}
return null;
}
@Override
public Object getRowKey(Projet projet) {
return projet.getIdprojet();
}
@Override
public List<Projet> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
List<Projet> data = new ArrayList<Projet>();
//filter
for(Projet car : datasource) {
boolean match = true;
if (filters != null) {
for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
try {
String filterProperty = it.next();
Object filterValue = filters.get(filterProperty);
String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car));
if(filterValue == null || fieldValue.startsWith(filterValue.toString())) {
match = true;
}
else {
match = false;
break;
}
} catch(Exception e) {
match = false;
}
}
}
if(match) {
data.add(car);
}
}
//sort
if(sortField != null) {
// Collections.sort(data, new LazySorter(sortField, sortOrder));
}
//rowCount
int dataSize = data.size();
this.setRowCount(dataSize);
//paginate
if(dataSize > pageSize) {
try {
return data.subList(first, first + pageSize);
}
catch(IndexOutOfBoundsException e) {
return data.subList(first, first + (dataSize % pageSize));
}
}
else {
return data;
}
}
}
this is the screenshot of datatable: 这是数据表的截图: and this is what i get when i select a row: 这是我选择一行时得到的:
your problem is this methode return null 你的问题是这个方法返回null
@Override
public Projet getRowData(String rowKey) {
for(Projet projet : datasource) {
if(projet.getIdprojet().equals(rowKey))
return projet;
}
return null;
}
delete it and try 删除它并尝试
Hy, HY,
your error is: 你的错误是:
Caused by: java.lang.NullPointerException
at com.gestion.projet.web.jsf.ProjetComponentImpl.onRowSelect(ProjetComponentImpl.java:92)
is caused by 是由...引起的
((Projet) event.getObject()).getIdprojet().toString()
your object projet is not null. 你的对象projet不是null。 the null object is the idProject. null对象是idProject。 go to your projet and verify if he has id valorized 去你的项目并验证他是否已经获得了自己的价值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.