JSF2 composite cc.attrs expression does not evaluate action parameters correctly

蹲街弑〆低调 提交于 2019-12-23 19:11:59

问题


I have a JSF composite component which is a list of email addresses that can be dynamically added to, and deleted from:

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

This component is used as follows:

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

Where the 'deleteEmail' action is invoked it causes an exception:

ERROR [STDERR] Caused by: javax.el.MethodNotFoundException: /resources/edit/emailAddresses.xhtml @34,130 action="#{cc.attrs.addressable.remove(email)}": Method not found: No-Interface view for endpoint [ jboss.j2ee:jar=tephra.war,name=PersonAddressable,service=EJB3 ] and session 3j011-mgweoj-ghfwhlvv-1-ghfy2e5j-e1.remove()

However if the action is changed to personAddressable.remove(email) it works! This seems like simple parameter substitution and shouldn't make any difference. The action for adding an email address, which does not have a parameter, works fine.

I won't post the code for the backing bean as I've proved it works. But for reference it is a stateful conversation scoped bean (CDI).

I am using JBoss AS6-M5 which uses el 2.2.


回答1:


I could reproduce the problem on Tomcat 7.0.5, but not on Glassfish 3.0.1. This means that there's a bug in EL implementation of Tomcat. I've reported a bug about it: Tomcat Bug 50449.

Since JBoss is under the covers using a fork of Tomcat, it's not a surprise that the same bug could manifest in JBoss as well.

You could (temporarily) workaround this by using f:setPropertyActionListener instead.

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

in combination with an email property in the Addressable bean, with at least a setter.



来源:https://stackoverflow.com/questions/4385545/jsf2-composite-cc-attrs-expression-does-not-evaluate-action-parameters-correctly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!