在websocket

时间:2015-05-19 17:15:03

标签: jsf websocket managed-bean

我正在开发一个实时应用程序。我有websockets和应用程序范围的托管bean。我正在尝试从websocket访问应用程序范围的托管bean,但我不能。这可能吗?

这是我的websocket和托管bean(应用程序作用域):

@ServerEndpoint("/mediador")
@ManagedBean(eager = true)
@ApplicationScoped
public class Mediador implements Serializable {

@ManagedProperty(value = "#{aplicacion}")
    private Aplicacion aplicacion;
...

我的“Aplicacion”托管bean:

@ManagedBean(eager = true)
@ApplicationScoped
public class Aplicacion implements Serializable {
...

如果我尝试在Mediador类中访问de managed property“aplicacion”,那么它为null,因此我得到一个NullPointerException。

由于

1 个答案:

答案 0 :(得分:3)

这真的不对。

@ServerEndpoint("/mediador")
@ManagedBean(eager = true)
@ApplicationScoped
public class Mediador implements Serializable {

WS(JSR-356 WebSocket)API和JSF API完全相互独立。他们彼此一无所知,并且不会考虑彼此的混合注释。

实际上,您最终会得到该类的两个实例。一个是ws://.../mediador提供的WS托管服务器端点,另一个是#{mediador}提供的JSF托管bean。 @ManagedProperty只能由JSF托管bean工具识别,并且只能在JSF托管bean实例中工作。

改用CDI。它适用于整个Java EE Web应用程序。不仅在WebSocket端点中,而且在JSF托管bean,WebServlet,WebFilters,WebListeners,JAX-RS资源,JAX-WS资源等中。最终,JSF托管bean工具将被弃用,转而支持CDI。这将在Java EE 9中发生,或者可能已经发生在8。

@ServerEndpoint("/mediador")
public class Mediador { // Shouldn't be serializable!

    @Inject
    private Aplicacion aplicacion;

    // ... (no getter+setter needed!)
}
@Named
@ApplicationScoped // javax.enterprise.context 
public class Aplicacion { // Shouldn't be serializable!

    // ...

}

无关具体问题:正确地在JSF中实现websockets并不是一件容易的事情,当然,如果您想考虑JSF会话和查看范围,并且希望是能够在推送期间定位特定用户。您最好查看现有的推送组件。另请参阅How can server push asynchronous changes to a HTML page created by JSF?