Свойство 'xxxxxx' не найдено по типу org.richfaces.component.UIRepeat - PullRequest
2 голосов
/ 13 сентября 2011

Я обновляю JSF 1.2 до JSF 2 и Richfaces 3.3 до 4. Я пробовал разные версии JSF2 (2.02, 2.06 и т. Д.) И все выдают одну и ту же ошибку.

Яполучаю следующую ошибку, которая уже несколько часов ранит мою голову!

SEVERE: Error Rendering View[/my-testfile.xhtml]
javax.el.PropertyNotFoundException: /templates/components-navigation.xhtml @31,54 rendered="#{component.allowed}": Property 'allowed' not found on type org.richfaces.component.UIRepeat

/ templates / components-navigation.xhtml

<a4j:outputPanel rendered="#{loginBean.loggedIn}">

    <a4j:repeat var="menugroup" value="#{componentNavigator.groups}">

        <a4j:region rendered="#{menugroup.itemCount > 0}">

            <div class="panel_menu"> 

                <table class="title" border="0" width="100%">
                  <tr>
                    <td>
                        <h:outputText class="text" value="#{messages[menugroup.id]}" />
                    </td>
                  </tr>
                </table>

                <table class="links" border="0" width="100%">
                    <tbody>
                        <a4j:repeat var="component" value="#{componentNavigator.components}">


                            <a4j:region rendered="#{component.allowed}">

                                <a4j:region rendered="#{component.groupId == menugroup.id}">
                                    <tr class="#{component.current?'active':'unactive'}">
                                        <td>&nbsp;</td>
                                        <td class="text" width="100%">
                                            <h:commandLink action="#{component.getCommandAction}" actionListener="#{componentNavigator.initControllerBean}">                                        
                                                <span style="display:block;">
                                                    #{messages[component.id]}                                       
                                                </span>
                                                <f:attribute name="controllerBean" value="#{component.controllerBean}" />
                                                <f:setPropertyActionListener target="#{componentNavigator.currentComponent}" value="#{component}" />
                                            </h:commandLink>
                                        </td>
                                    </tr>
                                </a4j:region>

                            </a4j:region>

                        </a4j:repeat>           
                    </tbody>
                </table>

            </div>

        </a4j:region>

    </a4j:repeat>

</a4j:outputPanel>

Строка 31:

<a4j:region rendered="#{component.allowed}">

Есть идеи, почему свойство не найдено?Есть ли известная проблема с компонентом повтора?

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

#{component} - это зарезервированный и неявный объект EL, который ссылается на текущий компонент JSF.Его можно использовать следующим образом:

<h:inputText value="#{bean.value}" styleClass="#{component.valid ? 'ok' : 'error'}" />

В приведенном выше примере #{component} разрешается в UIInput экземпляр, представляющий текущий <h:inputText>, который в свою очередь имеетisValid() метод.После отправки, когда компонент имеет ошибку проверки, будет установлен класс стиля error (который может иметь, например, красноватый цвет фона), в противном случае будет установлен класс стиля ok.Это похоже на this в JavaScript.

Вы должны дать своим переменным области видимости другое имя. не используйте имя одного из следующих зарезервированных объектов EL в JSF:

0 голосов
/ 13 сентября 2011

Я изменил:

<a4j:repeat var="component" value="#{componentNavigator.components}">

до:

<a4j:repeat var="myComponent" value="#{componentNavigator.components}">

и теперь все хорошо :) 1007 *

Я наткнулся на эту проблему, которая дала мне подсказку:

https://issues.jboss.org/browse/RF-8026

0 голосов
/ 13 сентября 2011

Вашему компоненту требуется метод

public boolean getAllowed() {
    return this.allowed;
}

и

public void setAllowed(boolean allowed) {
   this.allowed = allowed;
}

.Свойство - это поле в вашем компоненте, для которого требуется общедоступный метод получения и установки.Большинство IDE поддерживают генерацию этих методов, ищите что-то вроде «Source -> Generate Getter and Setter».

Другой возможностью будет прямой вызов метода.Что-то вроде

<a4j:region rendered="#{component.isAllowed()}">

с кодом компонента

public boolean isAllowed() {
    return this.allowed;
}

Если вы уже получили и установили в своем компоненте componentNavigator, было бы полезно, если бы вы могли опубликовать его здесь (или частиоб этом).

Ричард

...