Jsf 多次选择p:dataTable的行时出错
我有一个示例表单,我正在测试Jsf 多次选择p:dataTable的行时出错,jsf,primefaces,Jsf,Primefaces,我有一个示例表单,我正在测试p:tabViewp:tabp:datatable,我可以在其中设置要显示的行数,并选择一行以在表单的其他部分显示其内容。问题是,当我选择表中的一行时,内容只显示一次。我可以选择不同的行并显示内容,但如果我多次选择同一行,则会出现以下错误: WARNING [http-nio-8084-exec-36] com.sun.faces.lifecycle.InvokeApplicationPhase.execute /index.xhtml @43,153 listene
p:tabView
p:tab
p:datatable
,我可以在其中设置要显示的行数,并选择一行以在表单的其他部分显示其内容。问题是,当我选择表中的一行时,内容只显示一次。我可以选择不同的行并显示内容,但如果我多次选择同一行,则会出现以下错误:
WARNING [http-nio-8084-exec-36] com.sun.faces.lifecycle.InvokeApplicationPhase.execute /index.xhtml @43,153 listener="#{controlador.seleccionoFila}": java.lang.NullPointerException
javax.el.ELException: /index.xhtml @43,153 listener="#{controlador.seleccionoFila}": java.lang.NullPointerException
//more
Caused by: java.lang.NullPointerException
at Controller.Controlador.seleccionoFila(Controlador.java:81)
//more
13-Feb-2015 07:54:23.933 SEVERE [http-nio-8084-exec-36] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError java.lang.NullPointerException
我不明白为什么我只知道,如果我删除ManagedBean-seleccionfila()方法中表示Error的行,它就会工作。我不知道这是否是因为我在那里设置了一个值,这是唯一的区别
表格
<h:form id="form">
<p:tabView id="tabView">
<p:tab title="Uno">
<p:panelGrid columns="1">
<p:panelGrid columns="2">
<p:panelGrid columns="2">
<p:outputLabel value="Introduce el valor de j:"/>
<p:inputText value="#{controlador.j}"/>
<p:commandButton value="Listar tabla" action="#{controlador.listar}" update="tabla" />
</p:panelGrid>
<p:dataTable id="tabla" value="#{controlador.listaDos}" var="d" rowKey="#{d.idUno}" selectionMode="single" selection="#{controlador.dosSeleccionado}">
<p:ajax event="rowSelect" listener="#{controlador.seleccionoFila}" update=":form:tabView:pnlSeleccionado" />
<p:column headerText="ID">
<p:outputLabel value="#{d.idUno}"/>
</p:column>
<p:column headerText="Nombre">
<p:outputLabel value="#{d.nombreUno}"/>
</p:column>
<p:column headerText="Descripción">
<p:outputLabel value="#{d.descripcion}"/>
</p:column>
</p:dataTable>
</p:panelGrid>
<p:panelGrid id="pnlSeleccionado" columns="2">
<p:outputLabel value="ID seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.idUno}"/>
<p:outputLabel value="Nombre seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.nombreUno}"/>
<p:outputLabel value="Descripcion seleccionado"/>
<p:outputLabel value="#{controlador.dosSeleccionado.descripcion}"/>
<p:outputLabel value="Otro campo"/>
<p:outputLabel value="#{controlador.otro}"/>
</p:panelGrid>
</p:panelGrid>
</p:tab>
</p:tabView>
</h:form>
ManagedBean
@ManagedBean
@ViewScoped
public class Controlador implements Serializable {
public Controlador() {
this.dos = new Dos();
this.j = 0;
this.listaDos = new ArrayList<>();
this.dosSeleccionado = new Dos();
}
private Dos dos;
private int j;
private List<Dos> listaDos;
private Dos dosSeleccionado;
private int otro;
//setters and getters
public void listar() {
this.listaDos = this.dos.listarDos(this.j);
}
public void seleccionoFila() {
this.otro = this.dosSeleccionado.getIdUno() * this.dosSeleccionado.getIdUno();
/*Error*/this.dosSeleccionado.setIdUno(this.dosSeleccionado.getIdUno() + 10);
}
}
@ManagedBean
@视域
公共类Controlador实现可序列化{
公共控制{
this.dos=新的dos();
这个。j=0;
this.listaDos=新的ArrayList();
this.dosselectionado=新Dos();
}
私人文件;
私人int j;
私有列表列表;
私人Dos DOSSELECIONADO;
私人国际奥特罗;
//二传手和接球手
公共无效列表(){
this.listaDos=this.dos.listarDos(this.j);
}
公共无效seleccionoFila(){
this.otro=this.dosselectionado.getIdUno()*this.dosselectionado.getIdUno();
/*错误*/this.dosselectionado.setIdUno(this.dosselectionado.getIdUno()+10);
}
}
Uno
public class Uno implements Serializable{
private int idUno;
private String nombreUno;
//setters and getters
public LinkedList listarUno() {
LinkedList<Uno> listaUno = new LinkedList<>();
for (int i = 10; i < 21; i++) {
Uno u = new Uno();
u.idUno = i;
u.nombreUno = i + " " + (i + i);
listaUno.add(u);
}
return listaUno;
}
}
公共类Uno实现可序列化{
伊杜诺私人酒店;
私有字符串nombreUno;
//二传手和接球手
公共链接列表listarUno(){
LinkedList listaUno=新建LinkedList();
对于(int i=10;i<21;i++){
Uno u=新Uno();
u、 idUno=i;
u、 nombreUno=i++(i+i);
加上(u);
}
返回listaUno;
}
}
Dos
public class Dos extends Uno implements Serializable {
private String descripcion;
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public LinkedList listarDos(int j) {
LinkedList<Dos> lista = new LinkedList<>();
for (int i = 0; i < j; i++) {
Dos d = new Dos();
d.setIdUno(i);
d.setNombreUno(i + " " + i);
d.setDescripcion(i + " " + i + " " + i + " " + i);
lista.add(d);
}
return lista;
}
}
公共类Dos扩展Uno实现可序列化{
私有字符串描述;
公共字符串getDescription(){
返回描述;
}
公共void setDescription(字符串Description){
this.descripion=descripion;
}
公共链接列表列表(int j){
LinkedList lista=新建LinkedList();
对于(int i=0;i
选择“两次”相同的项目意味着取消选择。因此,dosselectionado
为空,您会得到一个NPE。@SJuan76在方法的开始部分selectionofila
我检查了如果值为空:然后实例化它,这意味着它没有得到所选的值(当我单击两次并调试它并检查您所说的内容时)。所以,如果我再次单击它,应该会给出值,不是吗?我试过了,但仍然无效(第三次),所以我认为这不是问题所在。正如我在删除方法seleccionfila
中显示Error的行时所说,当我单击行时,它会(一次又一次)得到值。我不明白为什么会这样。我错了,如果问题是dosselectionado
你会在前一行得到一个NPE。问题似乎出在您的setIdUno
方法上。