jsp jstl javabeans el propertynotfoundexception

jsp - javax.el.PropertyNotFoundException: la propiedad ''foo'' no se encuentra en el tipo com.example.Bean



jstl javabeans (2)

Tengo resultados de

Query query = session.createQuery("From Pool as p left join fetch p.poolQuestion as s");

consulta y me gustaría mostrarlo en JSP.

Tengo un bucle

<c:forEach items="${pools}" var="pool"> <p>${pool.name}</p> </c:forEach>

y me gustaría mostrar los resultados de la tabla poolQuestion (que es la tabla de unión). El valor que quiero mostrar es ''respuesta''.

¿Cómo puedo hacerlo?

<c:forEach items="${pools}" var="pool"> <p>${pool.answer}</p> <p>${pool.name}</p> </c:forEach>

El código anterior no funciona.

El error es:

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/home.jsp at line 21 18: <c:forEach items="${pools}" var="pool"> 19: 20: <p>${pool.name}</p> 21: <c:out value="${pool.poolQuestion.answer}"/> 22: 23: </c:forEach> 24: SEVERE: Servlet.service() for servlet appServlet threw exception javax.el.PropertyNotFoundException: Property ''answer'' not found on type com.pool.app.domain.Pool at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:214) at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:191) at javax.el.BeanELResolver.property(BeanELResolver.java:300) at javax.el.BeanELResolver.getValue(BeanELResolver.java:81) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) at org.apache.el.parser.AstValue.getValue(AstValue.java:123) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938) at org.apache.jsp.WEB_002dINF.views.home_jsp._jspx_meth_c_005fforEach_005f0(home_jsp.java:119) at org.apache.jsp.WEB_002dINF.views.home_jsp._jspService(home_jsp.java:78) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:680)

El modelo es:

public List<Pool> getAll(){ Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("From Pool as p left join fetch p.poolQuestions as s"); return query.list();

El controlador es:

List<Pool> pool = poolService.getAll(); model.addAttribute("pools", pool);

Y la vista es:

<c:forEach items="${pools}" var="pool"> <p>${pool.name}</p> <c:out value="${pool.answer}"/> </c:forEach>

PD. el ${pool.name} se muestra correctamente


javax.el.PropertyNotFoundException: la propiedad ''foo'' no se encuentra en el tipo com.example.Bean

Esto significa literalmente que la clase mencionada com.example.Bean no tiene un método getter público (¡no estático!) Para la propiedad mencionada foo . Tenga en cuenta que el campo en sí es irrelevante aquí!

El nombre del método getter público debe comenzar con get , seguido por el nombre de la propiedad que está en mayúscula solo en la primera letra del nombre de la propiedad como en Foo .

public Foo getFoo() { return foo; }

Por lo tanto, debe asegurarse de que exista un método getter que coincida exactamente con el nombre de la propiedad, y que el método sea public ( no static ) y que el método no tome ningún argumento y que devuelva el carácter no void . Si tiene uno y aún así no funciona, es probable que haya estado ocupado editando y editando código sin haber limpiado la compilación, reconstruido el código y vuelto a implementar / reiniciando la aplicación. Debes asegurarte de haberlo hecho.

Para Boolean propiedades boolean (¡no Boolean !), El nombre del método getter debe comenzar con is lugar de get .

public boolean isFoo() { return foo; }

Independientemente del tipo, la presencia del campo foono es relevante. Puede tener un nombre diferente, o estar completamente ausente, o incluso ser static . Todo lo de abajo debe ser accesible por ${bean.foo} .

public Foo getFoo() { return bar; }

public Foo getFoo() { return new Foo("foo"); }

public Foo getFoo() { return FOO_CONSTANT; }

Usted ve, el campo no es lo que cuenta, sino el método getter en sí mismo. Tenga en cuenta que el nombre de la propiedad en sí no debe estar en mayúscula en EL. En otras palabras, ${bean.Foo} nunca funcionará, debería ser ${bean.foo} .

Ver también:


Creo que los accesadores de id no coinciden con las convenciones de nomenclatura de beans y es por eso que se lanza la excepción. Deberían ser los siguientes:

public Integer getId() { return id; } public void setId(Integer i){ id= i; }