que - JSF2-javax.el.PropertyNotFoundException. No trabajando con métodos
showcase iceface (1)
cuando intento mostrar la vista, el navegador muestra este error
01:46:11,371 GRAVE [javax.enterprise.resource.webcontainer.jsf.application] (http--127.0.0.1-8080-1) Error Rendering View[/index.xhtml]: javax.el.PropertyNotFoundException: /index.xhtml @15,74 value="#{actividades.getAll}": The class ''org.pfc.controller.principal.ActividadesController'' does not have the property ''getAll''.
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
Código de ActvidadController
@ManagedBean(name="actividades")
@ViewScoped public class ActividadesController implements Serializable {
private static final long serialVersionUID = 1L;
private final static Log logger=LogFactory.getLog(ActividadesController.class);
@ManagedProperty(value="#{actividadBO}")
private ActividadBO actividad;
public void setActividad(ActividadBO actividad) {
this.actividad = actividad;
}
public List<Actividad> getAll(){
logger.trace("ActividadesController.getAll");
return actividad.getAll();
}
}
Ver código
<h:body>
<ui:composition template="/WEB-INF/templates/main-template.xhtml">
<ui:define name="content">
<h:dataTable value="#{actividades.getAll}" var="actividad">
<h:column>
<f:facet name="header">
<h:outputText>Título</h:outputText>
</f:facet>
<h:outputText value="{actividad.titulo}"></h:outputText>
</h:column>
</h:dataTable>
</ui:define>
</ui:composition>
</h:body>
Uso JBOSS 7 y mi proyecto tiene las bibliotecas el-impl2.2.jar, el-api.1.1.jar y icefaces3.
No entiendo por qué el render no funciona.
¿Alguna sugerencia?
Saludos cordiales.
Aquí,
<h:dataTable value="#{actividades.getAll}" var="actividad">
Tu expresión EL no es válida. Está buscando un método getGetAll()
, pero solo tiene un método getAll()
que representa un getter para la propiedad (fictive). La propiedad no necesita existir en absoluto (se supone que es private
todos modos).
Por lo tanto, para solucionar su problema, debe ser
<h:dataTable value="#{actividades.all}" var="actividad">
o, si usa EL 2.2 (pero de esta manera no se recomienda)
<h:dataTable value="#{actividades.getAll()}" var="actividad">
De cualquier manera, llamará al método getAll()
adecuado.
Sin relación con el problema concreto, por cierto tienes otro defecto de diseño en tu código. Se invoca un getter tantas veces como EL lo necesite para resolverlo. Hacer un trabajo de acceso a la base de datos / negocios dentro de un método getter es una mala idea. Se supone que un getter solo devuelve propiedades de frijol. En su lugar, mueva el trabajo de DB al constructor (post) de bean.
private List<Actividad> all;
@PostConstruct
public void init() {
all = actividad.getAll();
}
public List<Actividad> getAll(){
logger.trace("ActividadesController.getAll");
return all;
}