0

estoy trabajando en un proyecto con jsf y primefaces, gestione los datos por medio de orm, tengo este formulario que me trae todos los cursos de mi base de datos, con un command link en la ultima columna que deje ver los alumnos del curso que seleccione , cuando de click en el curso el actionListener ejecuta un método que me debería traer todos los alumnos del curso seleccionado, pero me sale la excepción en la consola porque el atributo del command link viene vacío y por ende no trae nada de la base de datos

gracias por su ayuda

<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>

        <p:breadCrumb>
            <p:menuitem value="Categories" url="/cursos" />
            <p:menuitem value="Registro Alumnos" url="faces/vistaAlumnos.xhtml" />
            <p:menuitem value="Consultar cursos" url="#" />

        </p:breadCrumb>
        <br/>
        <br/>
        <h:form>
            <p:dataTable value="#{cvc.cursitos}" var="cur">
                <f:facet name="header" >
                    Cursos Existentes
                </f:facet>
                <p:column headerText="Id Curso">
                    <p:outputLabel value="#{cur.idCurso}"/>
                </p:column>
                <p:column headerText="Nombre">
                    <p:outputLabel value="#{cur.nombre}"/>
                </p:column>
                <p:column headerText="Cupo">
                    <p:outputLabel value="#{cur.cupo}"/>
                </p:column>
                <p:column>
                    <p:commandLink value="ver alumnos inscritos" onclick='PF("dlg1").show()'  actionListener="#{cvc.seleccionarCurso(evt)}" update="@form:tabla">
                        <f:attribute name="click_curso" value="#{cur}"/>
                    </p:commandLink>
                </p:column>
            </p:dataTable>

            <p:dialog   header="Alumnos inscritos" widgetVar="dlg1" modal="true" height="100">
                <p:dataTable id="tabla" value="#{cvc.alumnosDelCurso}" var="a" >

                    <p:column headerText="Id alumno">
                        <p:outputLabel value="#{a.idAlumno}"/>
                    </p:column>
                    <p:column headerText="documento">
                        <p:outputLabel value="#{a.documento}"/>
                    </p:column>
                    <p:column headerText="nombre">
                        <p:outputLabel value="#{a.nombre}"/>
                    </p:column>


                </p:dataTable>
            </p:dialog>  
        </h:form>
    </h:body>
</html>

@ManagedBean(name="cvc")
@RequestScoped
public class ControlVerCursos {
    
    private List<Cursos> cursitos;
    private List<Alumnos> alumnosDelCurso;

    public List<Cursos> getCursitos() {
        cursitos= new CursosDAO().traerTodosLosCursos();
        return cursitos;
    }

    public void setCursitos(List<Cursos> cursitos) {
        this.cursitos = cursitos;
    }

    public List<Alumnos> getAlumnosDelCurso() {
        return alumnosDelCurso;
    }

    public void setAlumnosDelCurso(List<Alumnos> alumnosDelCurso) {
        this.alumnosDelCurso = alumnosDelCurso;
    }

   

    public List<Cursos> getCursos() {
        cursitos=new CursosDAO().traerTodosLosCursos();
        return cursitos;
    }

    public void setCursos(List<Cursos> cursos) {
        this.cursitos = cursos;
    }
    
    public void seleccionarCurso(ActionEvent evt){
       
        Cursos cursito=(Cursos)evt.getComponent().getAttributes().get("click_curso");
     
        
         alumnosDelCurso=cursito.getAlumnosList();
        
        
         
    }
}
Nicolas Aldana
  • 589
  • 2
  • 14
  • 1
    ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – BetaM Dec 18 '19 at 01:20
  • hola, puedes validad si tu campo viene vacio por medio de if o un try catch, eso hara que no se lanze la exception y tu programa no se detenga – Nicolas Aldana Dec 18 '19 at 01:21
  • Siempre que solicites ayuda sobre una excepción trata de agregar la traza e indicar la línea en que se produce. – E. Betanzos Dec 18 '19 at 01:33

1 Answers1

0

En el actionListener="#{cvc.seleccionarCurso(evt)}". Le estas pasando una variable evt que no existe. Si quitas esta variable y solo dejas #{seleccionarCurso}, entonces el jsf invocará a seleccionarCurso(ActionEvent evt). Con el evento correcto. Lo que pasas es que tu la estás invocando con evt que no existe.

Lo que yo haría es pasar al actionListener de una vez #{cur} en lugar de tener un atributo:

    actionListener="#{cvc.seleccionarCurso(cur)"}


         public void seleccionarCurso(Cursos cursito){ 

        (

          alumnosDelCurso=cursito.getAlumnosList(); 

      }
Juan Carlos Guibovich
  • 2,735
  • 1
  • 5
  • 14
  • eyyy mil gracias, funciono correctamente, pero tengo una duda para que me sirve el actionEvent entonces, pues el ejemplo que nos puso el profe contenia este parámetro y funcionaba. O tiene que ver algo con la versión de java? – Nicolas Aldana Dec 19 '19 at 00:02
  • El actionevent ejecuta una acción navegable y devuelve un string que contiene la página a donde navegar. Si devuelve nulos se queda en la misma página. El actionlistener en una acción no navegable donde puedes realizar algún proceso y luego actualizar con ajax. Si se declara por ejemplo un botón de comando que tenga un action y un actionlistener primero se ejecuta el actionlistener y luego el action de modo tal que puedas preparar algunos datos previos a navegar otra página. Espero hacerme entender con esta explicación. – Juan Carlos Guibovich Dec 19 '19 at 00:27
  • Supongo que una fé de erratsasnlo de tu profe o que sea un ejemplo distinto. – Juan Carlos Guibovich Dec 19 '19 at 00:34
  • en esta linea de código "evt.getComponent().getAttributes().get("click_curso");" nos explico que accede al objeto curso que se llega por parámetro del formulario y este lo convertimos en una lista de tipo cursos para acceder a la lista Alumnos, no entendí muy bien pero tu solución me funciono perfectamente gracias amigo – Nicolas Aldana Dec 19 '19 at 00:49
  • El código está correcto el único problema es el (evt) del actionListener. Quitando eso deberia funcionar correctamente. Si solo modificas : actionListener="#{cvc.seleccionarCurso}" el resto de tu código funcionará porque el jsf invocara a seleccionarCurso(ActionEvent evt). Esto es bueno cuando tienes más de un f:attributte porque los puedes recuperar con el evt. – Juan Carlos Guibovich Dec 19 '19 at 01:34
  • muchas gracias. me han servido mucho tus explicaciones pues estoy iniciando en jsf – Nicolas Aldana Dec 19 '19 at 02:14