1

Primepush を使用して行が追加された後、データテーブルを更新しようとしています。つまり、user1 がデータテーブルを更新し、user2 がページを更新せずに追加された行を表示する必要があります。

私の Primefaces バージョンは 5.2 で、Atmosphere ランタイム バージョンは 2.3.3 です。

Primefaces Showcase と User Guide に基づいて実装しようとした関連コードは次のとおりです。

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 version="3.0">

    <display-name>PrimeFaces Web Application</display-name>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>        

    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>AccessFilter</filter-name>
        <filter-class>view.AccessFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AccessFilter</filter-name>
        <url-pattern>/secured/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
    </servlet-mapping>
</web-app>

バッキング Bean:

@ManagedBean
@ViewScoped
@PushEndpoint("/main")
public class MainBean implements Serializable{

...

    public void addContact(ActionEvent event){

        ... // database operations

        Contact con = new Contact(); 

        contacts.add(con); // this is an ArrayList

        EventBus eventBus = EventBusFactory.getDefault().eventBus();
        eventBus.publish("/main", contacts);
    }

    @OnMessage(encoders = {JSONEncoder.class})
    public ArrayList<Contact> getContacts(){
        return contacts;
    }
}    

main.xhtml:

...

<p:commandButton value="Add Contact" update=":form:datatable" 
    actionListener="#{mainBean.addContact}" ajax="true"/>

<h:form id="form">
    <p:dataTable id="datatable" var="contact" value="#{mainBean.contacts}" 
     selectionMode="single" rowKey="#{contact.firstName}" 
     selection="#{mainBean.selectedContact}">

        <p:column headerText="First Name">
            <h:outputText value="#{contact.firstName}"/>
        </p:column>
        <p:column headerText="Last Name">
            <h:outputText value="#{contact.lastName}"/>
        </p:column>
    </p:dataTable>
</h:form>
<p:socket channel="/main">
    <p:ajax event="message" update=":form:datatable"/>
</p:socket>

テーブルに行を追加しようとすると、エラーは発生しませんが、一部の行が失われます。更新すると、テーブルは本来の方法で再読み込みされます。追加された行は、異なるユーザー間でも渡されません。user1 がテーブルに値を追加した後、user2 は更新して変更を確認する必要があります。

このリンクの提案も試しましたが、成功しませんでした。私はprimepushを初めて使用し、オンラインで見つけた例(ユーザーガイド以外)はPrimefacesの非常に古いバージョン用であり、Primefaces 5以降はプッシュ機能が大幅に変更されたようです。助けていただければ幸いです。

編集:これらのリンクも試しました: linklinklink

編集 2: プッシュが機能しているかどうかをログに記録しましたが、実際に機能しているようです。プッシュが有効になっているページに移動すると、コンソールでアクティブになっていることがわかります。しかし、テーブルを更新しようとすると、テーブルを埋めているリストの get メソッドが、プッシュ後に 3 回連続して呼び出されます...

4

0 に答える 0