3

動的に追加および削除できる電子メールアドレスのリストである 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-Interface ビューエンドポイント [ jboss.j2ee:jar=tephra.war,name=PersonAddressable,service=EJB3 ] およびセッション 3j011-mgweoj-ghfwhlvv-1-ghfy2e5j-e1.remove()

ただし、アクションを personAddressable.remove(email) に変更すると機能します! これは単純なパラメーター置換のように見え、違いはありません。パラメーターを持たない電子メール アドレスを追加するアクションは正常に機能します。

バッキング Bean が機能することを証明したので、バッキング Bean のコードは投稿しません。ただし、参考までに、これはステートフルな対話スコープ Bean (CDI) です。

el 2.2 を使用する JBoss AS6-M5 を使用しています。

4

1 に答える 1

4

Tomcat 7.0.5 では問題を再現できましたが、Glassfish 3.0.1 では再現できませんでした。これは、Tomcat の EL 実装にバグがあることを意味します。それに関するバグを報告しました: Tomcat Bug 50449

JBoss は Tomcat のフォークを使用して隠蔽されているため、JBoss でも同じバグが発生する可能性があります。

f:setPropertyActionListener代わりに使用することで、これを (一時的に) 回避できます。

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

emailBean のプロパティと組み合わせて、Addressable少なくともセッターを使用します。

于 2010-12-10T02:47:14.620 に答える