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 foo
sí no 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:
- javax.el.PropertyNotFoundException: la propiedad ''foo'' no es legible en el tipo java.lang.Boolean
- ¿Cómo resuelve el lenguaje de expresiones Java los atributos booleanos? (en JSF 1.2)
- Identificar y resolver javax.el.PropertyNotFoundException: destino inalcanzable
- El código Facelets Outcommented todavía invoca expresiones EL como # {bean.action ()} y causa javax.el.PropertyNotFoundException en # {bean.action}
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; }