JSF2 - исключение javax.el.PropertyNotFoundException.Не работает с методами - PullRequest
4 голосов
/ 08 марта 2012

, когда я пытаюсь отобразить представление, браузер показывает эту ошибку

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]

Код 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();
    }
}

Код представления

    <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>

Я использую JBOSS 7, и в моем проекте есть библиотеки el-impl2.2.jar, el-api.1.1.jar и icefaces3.

Я не понимаю, почему рендер неза работой.

Есть предложения?

С уважением.

1 Ответ

10 голосов
/ 08 марта 2012

Здесь

<h:dataTable value="#{actividades.getAll}" var="actividad">

Ваше выражение EL недопустимо. Он ищет метод getGetAll(), но у вас есть только метод getAll(), представляющий метод получения для (фиктивного) свойства all. Свойство вообще не должно существовать (в любом случае оно должно быть private).

Итак, чтобы решить вашу проблему, это должно быть

<h:dataTable value="#{actividades.all}" var="actividad">

или, если вы используете EL 2.2 (но этот способ не рекомендуется)

<h:dataTable value="#{actividades.getAll()}" var="actividad">

В любом случае, он вызовет правильный getAll() метод.


Не связано с конкретной проблемой, кстати, в вашем коде есть еще один недостаток дизайна. Получатель вызывается столько раз, сколько EL должно решить. Выполнение бизнес / доступа к базе данных в методе получения является плохой идеей. Предполагается, что получатель просто возвращает свойства компонента. Скорее переместите задание DB в конструктор (post) компонента.

private List<Actividad> all;

@PostConstruct
public void init() {
    all = actividad.getAll();
}

public List<Actividad> getAll(){
    logger.trace("ActividadesController.getAll");
    return all;
}

Смотри также:

...