选择p:dataTable的一行时多次出错

时间:2015-02-13 14:09:01

标签: jsf primefaces

我有一个示例表单,我正在测试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中的错误行 - seleccionoFila()方法,它就可以了。我不知道是不是因为我在那里设置了一个值,这是唯一的区别

表格

<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);
}

}

乌诺

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;
  }
}

待办事项

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;
  }   
}

0 个答案:

没有答案