JSF2复合cc.attrs表达式不能正确评估操作参数

时间:2010-12-08 08:38:59

标签: jsf jsf-2 el composite-component

我有一个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)}”:找不到方法:否 - 端点的接口视图[jboss.j2ee:jar = tephra.war,name = PersonAddressable,service = EJB3]和session 3j011-mgweoj-ghfwhlvv-1-ghfy2e5j-e1.remove()

但是,如果操作更改为personAddressable.remove(email),则可以正常工作!这似乎是简单的参数替换,不应该有任何区别。添加没有参数的电子邮件地址的操作可以正常工作。

我不会发布支持bean的代码,因为我已经证明它有效。但作为参考,它是一个有状态的会话范围bean(CDI)。

我使用的是使用el 2.2的JBoss AS6-M5。

1 个答案:

答案 0 :(得分:4)

我可以在Tomcat 7.0.5上重现问题,但不能在Glassfish 3.0.1上重现。这意味着Tomcat的EL实现存在一个错误。我已经报告了一个关于它的错误:Tomcat Bug 50449

由于JBoss使用Tomcat的分支,因此同样的bug也可以在JBoss中出现并不奇怪。

您可以(暂时)使用f:setPropertyActionListener来解决此问题。

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

email bean中的Addressable属性结合使用,至少有一个setter。