2

私は 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 を使用しています。ここで何が起こっているのかを理解してくれる人はいますか?

ありがとう

4

1 に答える 1

2

そのためのjira-issueがすでにあるようです。

于 2012-10-23T12:45:39.737 に答える