JSF WebSocket更新viewScope

时间:2019-01-19 06:55:37

标签: jsf jsf-2.3

我有一个名为sampleBean的bean,其范围为viewScope。
该bean从数据库(MySQL)加载一些数据。
我的问题是用户之间共享了一些记录。
现在也许[用户A]删除了该共享记录,而我想更新其他用户的视图。

我无法将范围更改为ApplicationScope,因为所有记录都共享给所有用户。

如何解决此问题?
注意:我读过此post,但不明白如何解决此问题。
注意:我使用JavaEE 8(webProfile)的Liberty 18.0.0.4

1 个答案:

答案 0 :(得分:-1)

我通过此简单代码解决了问题。 (我为您共享了此代码)

public class Information {
    private String name ;
    private String family ; 

    // constructor 
    // Getter & Setter 
    // override equal and hashCode

}

这是一项简单的服务。 (我在这堂课上模拟了数据库)

@Stateless
public class InformationService {

    private static final List<Information> db = new ArrayList<>();

    @Inject
    @Push(channel = "infoChannel")
    PushContext push;

    @PostConstruct
    public void init() {
        Information userA = new Information("John", "Vankate");
        Information userB = new Information("Julius", "Sampao");
        db.add(userA);
        db.add(userB);
    }

    public void remove(Information info) {
        db.remove(info);
        push.send("deleteInfo");
    }

    public List<Information> findAll() {
        return db;
    }
}

和简单的JaxRs资源:

@Path("/info")
@RequestScoped
public class InformationResources {

    @EJB
    private InformationService informationService;


    @Path("/delete")
    @POST
    @Consumes("application/json")
    public String send(Information information) {
        informationService.remove(information);
        return "Receive : " + information;
    }
} 

现在启动JSF:

@Named
@ViewScoped
public class InformationBean implements Serializable {

    private Information info ;
    private List<Information> informationList ;

    @EJB
    private InformationService informationService ;


    @PostConstruct
    public void init() {
        informationList = informationService.findAll();
        info = new Information() ;
    }

    public void deleteInformation() {
        informationService.remove(info);
    }

    public Information getInfo() {
        return info;
    }

    public void setInfo(Information info) {
        this.info = info;
    }

    public List<Information> getInformationList() {
        return informationList;
    }

    public void setInformationList(List<Information> informationList) {
        this.informationList = informationList;
    }
}

和xhtml:

<h:body>
    <p:dataTable value="#{informationBean.informationList}" var="info" id="infoTable">
        <p:column rowHeader="name">
            <h:outputText value="#{info.name}"/>
        </p:column>
        <p:column rowHeader="family">
            <h:outputText value="#{info.family}"/>
        </p:column>
        <p:column rowHeader="action">
            <h:form>
                <p:commandButton value="Delete" action="#{informationBean.deleteInformation}">
                    <f:setPropertyActionListener value="#{info}" target="#{informationBean.info}"/>
                </p:commandButton>
            </h:form>
        </p:column>
    </p:dataTable>
    <hr/>
    <f:websocket channel="infoChannel">
        <p:ajax event="deleteInfo" update="infoTable"/>
    </f:websocket>
</h:body>

我已经认为,PushContext必须在JSF bean上实现,现在我知道可以在 service 业务逻辑层中实现。
现在,您可以从JaxRs(Rest API)中删除信息并记录从p:dataTable中删除的记录,而无需刷新页面。
注意::此示例使用@ViewScoped