私は JSF にかなり慣れていないので、複合コンポーネントのユーザーから ajax される可能性のあるイベントをエクスポートする複合コンポーネントを構築したいと考えています。
http://www.ibm.com/developerworks/java/library/j-jsf2fu-0610/index.htmlにある指示に従って、次の ように composite:clientBehavior を使用しました。
<composite:interface>
<composite:attribute name="value" required="true"/>
<composite:attribute name="selection" required="true"/>
[.... some other composite:attributes]
<composite:facet name="header"/>
<composite:clientBehavior name="rowSelect" event="rowSelect" default="true" targets="#{cc.clientId}:cmpntVideos"/>
</composite:interface>
<composite:implementation>
<h:outputStylesheet library="css" name="VideoStatusTable.css" target="head" />
<div id="#{cc.clientId}">
<p:contextMenu for="cmpntVideos">
<p:menuitem value="#{cc.resourceBundleMap.VideoStatusTable_contextual_menu_edit}" icon="menu-edit"/>
<p:menuitem value="#{cc.resourceBundleMap.VideoStatusTable_contextual_menu_delete}" icon="menu-delete"/>
<p:menuitem value="#{cc.resourceBundleMap.VideoStatusTable_contextual_menu_abort}" icon="menu-abort"/>
<p:menuitem value="#{cc.resourceBundleMap.VideoStatusTable_contextual_menu_reenable}" icon="menu-reenable"/>
</p:contextMenu>
<p:dataTable id="cmpntVideos" var="video" value="#{cc.attrs.value}" rowKey="#{video.key}"
selection="#{cc.attrs.selection}" selectionMode="single" emptyMessage="#{cc.attrs.emptyValueListMsg}">
<composite:insertFacet name="header"/>
<p:column headerText="#{cc.resourceBundleMap.VideoStatusTable_contextual_table_title_video_id}" rendered="#{cc.attrs.showRoadName}">
#{video.humanReadableVideoId}
</p:column>
[.... many other column declaration]
<p:column headerText="#{cc.resourceBundleMap.VideoStatusTable_contextual_table_title_report_generation}" rendered="#{cc.attrs.showReportGeneration}" style="text-align: center;">
<f:facet name="header">
<h:graphicImage library="images" name="documents_24.png"/>
</f:facet>
<cmpnt:simpleProgressBar value="#{video.reportGenerationProgress}"/>
</p:column>
<f:facet name="footer">
<h:commandLink action="cc.attrs.refreshListener" style="float:right;">
<h:graphicImage library="images" name="button-rotate-cw_16.png"/>
<f:ajax render="cmpntVideos" execute="@this"/>
</h:commandLink>
</f:facet>
</p:dataTable>
</div>
</composite:implementation>
コンポーネントを次のように使用します。
<cmpnt:videoStatusTable id="VideoTransferStatusTable"
value="#{videoTransfer.tableModel}"
selection="#{videoTransfer.selectedTableReadyNotCompletelyTranferedVideo}"
showProcess="false"
showReportGeneration="false"
showValidation="false"
showDataOrganization="false"
>
<f:ajax event="rowSelect" listener="${videoTransfer.onVideoSelection}" render=":msgsArea"/>
</cmpnt:videoStatusTable>
しかし、これを実行すると (そして、rowSelect イベントをトリガーする行を選択すると)、次の例外が発生します。
SEVERE: Error Rendering View[/private/AssetManager.xhtml]
javax.faces.FacesException: java.io.NotSerializableException: com.sun.faces.facelets.tag.jsf.core.AjaxHandler
at com.sun.faces.renderkit.ResponseStateManagerImpl.getViewState(ResponseStateManagerImpl.java:137)
at javax.faces.application.StateManager.getViewState(StateManager.java:555)
[...]
Caused by: java.io.NotSerializableException: com.sun.faces.facelets.tag.jsf.core.AjaxHandler
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.ArrayList.writeObject(ArrayList.java:570)
[...]
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: CDATA tags may not nest
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630)
at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
ajax タグを削除すると、コンポーネントは正常に動作します (ただし、一部の機能はありません)。
Glassfish 3.1.2 を使用しています。ここで何が起こっているのかを理解してくれる人はいますか?
ありがとう