entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

JSF PrimeFaces

Me ha salido el siguiente error:
https://www.anony.ws/i/2016/08/10/error.png

Tengo el siguiente código:
-Content.xhtml:

<h:dataTable value="#{controller.MenuSelecions}" var="c"    styleClass="order-table"    headerClass="order-table-header"    rowClasses="order-table-odd-row,order-table-even-row">
        <h:column>
           <f:facet name="header"></f:facet>
            <h:outputText value="#{c.nombre}"/>
        </h:column>
    </h:dataTable>

-Controller:

@ManagedBean(name="controller")
@SessionScoped
public class Controller implements Serializable{
    public List<MenuSelecion> MenuSelecions() throws SQLException {
        Statement st = conex.createStatement();
        try {
            String cadSQL = "select * from menuSeleccion";
            rs = st.executeQuery(cadSQL);
            List<MenuSelecion> list = new ArrayList<MenuSelecion>();
            while(rs.next()){
                MenuSelecion MS = new MenuSelecion();
                MS.setNombre(rs.getString("nombre"));
                MS.setId(rs.getInt("id"));
                MS.setRutaArchivo(rs.getString("rutaArchivo"));
                MS.setTitle(rs.getNString("title"));
                //store all data into a List
                list.add(MS);
            }
            return list;
        }catch (SQLException e) {
            System.out.print(e);
        } finally {
            //conex.close();
        }
        return null;
    }

No entiendo porque pasa y aunque he googleado no me queda claro la forma de solucionarlo, estoy usando NetBeans

1 Respuesta

3votos

Javi2EE Puntos6630

Cuando se utiliza EL expression para asignar una propiedad a un value, esta no se hace directamente con el nombre del método, sino directamente con el nombre de la propiedad.

Ejemplo:


//controller
private List<MenuSeleccion> menusSeleccion;

private List<MenuSeleccion> getMenusSeleccion(){
return menusSeleccion;
}

//view

<h:dataTable value="#{controller.menusSeleccion}"...

Por defecto, si no se añade un paréntesis al final de la expresión JSF entiende que se trata da una propiedad de la clase y busca el getter asociado a dicha propiedad.

Teniendo esto en cuenta estas dos expresiones son equivalentes:

<h:dataTable value="#{controller.menusSeleccion}"...

<h:dataTable value="#{controller.getMenusSeleccion()}"... 

Al añadir los parentesis entiende que lo que buscamos es ejecutar un metodo no una propiedad.

Además de lo dicho NUNCA se debe añadir lógica de negocio en los métodos getter o setter de un controller ya que estos se ejecutan muchas veces, cada vez que se renderiza un componente o tras realizar un update en el front, muchísimo menos meter en ellos una llamada a la base de datos,y tampoco es buen diseño que estos lancen excepciones, ya que estos aparecerán directamente en la pagina que ve el usuario y provocaran fallos visibles en tu aplicación:

Un diseño adecuado para lo que buscas hacer seria añadir la creación de la lista en el método con la anotación postConstruct, que se ejecutara una sola vez tras el constructor así:

@ManagedBean(name="controller")
@SessionScoped
public class Controller implements Serializable{
    private List<MenuSeleccion> menusSeleccion;

    @PostConstruct
    public void init() {
        Statement st = conex.createStatement();
        try {
            String cadSQL = "select * from menuSeleccion";
            rs = st.executeQuery(cadSQL);
            List<MenuSelecion> list = new ArrayList<MenuSelecion>();
            while(rs.next()){
                MenuSelecion MS = new MenuSelecion();
                MS.setNombre(rs.getString("nombre"));
                MS.setId(rs.getInt("id"));
                MS.setRutaArchivo(rs.getString("rutaArchivo"));
                MS.setTitle(rs.getNString("title"));
                //store all data into a List
                list.add(MS);
            }
            menusSeleccion = list;
        }catch (SQLException e) {
            System.out.print(e);
        } finally {
            //conex.close();
        }

    }

    public List<MenuSeleccion> getMenusSeleccion(){
        if(menusSeleccion == null) init();
        return menusSeleccion;
    }
    //si sabes que los datos de la base de datos han cambiado invalidas la lista con este método y la próxima vez que la lista sea requerida se volverá a crear:

   public void reset(){
      menusSeleccion = null;
   }

De esta manera la llamada a la base de datos solo se ejecuta una vez, y cuando sabemos que los datos no son validos porque han cambiado hacemos que la propiedad sea null, así la próxima vez que se solicite mediante el getter se volverá a crear.

Un saludo

1voto

Yesod comentado

Vale, modificando el código por lo que me pusiste...ahora me sale este error:

An Error Occurred:
WELD-000049: Unable to invoke public void model.Controller.init() on model.Controller@78ac66

Empiezo a entender el funcionamiento de esto :D Gracias

1voto

Javi2EE comentado

Sin ver toda la traza del error primero revisa que la anotación que has puesto venga del paquete import javax.annotation.PostConstruct; Si aun así no funciona elimina la anotación PostConstruct y debería funcionar igual.
PostConstruct solo es util cuando sabes que esa lista va a ser necesaria justo despues de la creación del bean, si prefieres que se inicialice solo cuando sea necesario eliminala. Si sigue fallando añade toda la traza del error para poder ayudarte mas.
Un saludo

1voto

Yesod comentado

He quitado lo que me has dicho y me da error de null...xDD

El error me da justo en esta línea: Statement st = conex.createStatement();

An Error Occurred:
java.lang.NullPointerException
- Stack Trace

java.lang.NullPointerException
    at model.Controller.init(Controller.java:25)
    at model.Controller.getMenusSeleccion(Controller.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIData.getValue(UIData.java:732)
    at org.primefaces.component.api.UIData.getDataModel(UIData.java:629)
    at javax.faces.component.UIData.getRowCount(UIData.java:356)
    at org.primefaces.component.datalist.DataListRenderer.encodeMarkup(DataListRenderer.java:58)
    at org.primefaces.component.datalist.DataListRenderer.encodeEnd(DataListRenderer.java:45)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:458)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

Estoy investigando...pero me resulta que pueda ser la conexión, ya que es la misma BD que tengo para otra aplicación y si me funciona...

1voto

Javi2EE comentado

Efectivamente parece un error con la conexión y no esta relacionado con la pregunta inicial de Jsf, si necesitas ayuda con eso abre otra pregunta y añade el código relacionado con la conexión.
Un saludo.

2votos

Yesod comentado

Solucionado, el problema es que no tenía extends ConexionBD para recoger las propiedades de la clase conexión.

Ya me sale la web aunque en el menú me sale "No records found" supongo que tendré que mirar la consulta y demás, pero lo menos ya esta solucionado y he aprendido una mijita mas que ayer :D

Gracias por todo amigo :)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta