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
方法上。