Составное выражение cc.attrs в JSF2 неправильно оценивает параметры действия - PullRequest
3 голосов
/ 08 декабря 2010

У меня есть составной компонент JSF, представляющий собой список адресов электронной почты, которые можно динамически добавлять и удалять из:

<composite:interface shortDescription="Display party email addresses">
    <composite:attribute name="addressable" required="true"/>
</composite:interface>

<composite:implementation>  
    <h:panelGroup layout="block" id="emails">
        <h:dataTable id="emailList" value="#{cc.attrs.addressable.emailAddresses}" var="email" styleClass="data-list small-list" cellpadding="0" cellspacing="0">
            <h:column>
                <f:facet name="header">Address</f:facet>
                <h:inputText id="emailAddress" value="#{email.address}" size="30" maxlength="100" required="true" label="Email"/>
            </h:column>
            <h:column>
                <f:facet name="header">Description</f:facet>
                <h:inputText id="emailDescription" value="#{email.description}" size="20" maxlength="100"/>
            </h:column>        
            <h:column>
                <f:facet name="header">
                    <h:panelGroup styleClass="right-align" layout="block">
                        <h:commandLink id="addEmail" action="#{cc.attrs.addressable.addEmailAddress}" title="Add an email address">
                            <f:ajax execute=":#{cc.clientId}:emails" render=":#{cc.clientId}:emails"/>
                            <h:graphicImage library="images" name="add.png" id="emailAddImg"/>
                        </h:commandLink>
                    </h:panelGroup>
                </f:facet>
                <h:commandLink id="deleteEmail" action="#{cc.attrs.addressable.remove(email)}" title="Remove the email from this row">
                    <f:ajax execute=":#{cc.clientId}:emails" render=":#{cc.clientId}:emails"/>
                    <h:graphicImage library="images" name="delete.png" id="emailDeleteImg"/>
                </h:commandLink>
            </h:column>          
        </h:dataTable> 
    </h:panelGroup>
</composite:implementation>

Этот компонент используется следующим образом:

<edit:emailAddresses addressable="#{personAddressable}" id="emailAddresses"/>

Когда вызывается действие «deleteEmail», оно вызывает исключение:

ОШИБКА [STDERR] Причина: javax.el.MethodNotFoundException: /resources/edit/emailAddresses.xhtml @ 34,130 action = "# {cc.attrs.addressable.remove (email)}": метод не найден: No- Представление интерфейса для конечной точки [jboss.j2ee: jar = tephra.war, name = PersonAddressable, service = EJB3] и сеанса 3j011-mgweoj-ghfwhlvv-1-ghfy2e5j-e1.remove ()

Однако, если действие изменяется на personAddressable.remove (email), оно работает! Это похоже на простую замену параметров и не должно иметь никакого значения. Действие для добавления адреса электронной почты, у которого нет параметра, работает нормально.

Я не буду публиковать код для компонента поддержки, поскольку я доказал, что он работает. Но для справки это bean-объект с ограниченным состоянием разговора (CDI).

Я использую JBoss AS6-M5, который использует el 2.2.

1 Ответ

4 голосов
/ 10 декабря 2010

Я мог воспроизвести проблему на Tomcat 7.0.5, но не на Glassfish 3.0.1.Это означает, что есть ошибка в реализации EL Tomcat.Я сообщил об ошибке: Ошибка Tomcat 50449 .

Поскольку JBoss находится под прикрытием с использованием вилки Tomcat, неудивительно, что такая же ошибка может проявиться вхорошо.

Можно (временно) обойти это, используя вместо этого f:setPropertyActionListener.

<h:commandLink action="#{cc.attrs.addressable.remove}">
    <f:setPropertyActionListener target="#{cc.attrs.addressable.email}" value="#{email}" />

в сочетании со свойством email в Addressableбоб, по крайней мере с сеттером.

...