在websocket中注入应用程序作用域的托管bean



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

这是我的websocket和managed bean(应用程序范围):

@ServerEndpoint("/mediador")
@ManagedBean(eager = true)
@ApplicationScoped
public class Mediador implements Serializable {
@ManagedProperty(value = "#{aplicacion}")
    private Aplicacion aplicacion;
...

和我的" application "托管bean:

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

如果我尝试在Mediador类中访问去托管属性"application",它是空的,所以我得到一个NullPointerException。

谢谢

这是不对的。

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

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

实际上,您最终得到了该类的两个实例。一个作为WS托管服务器端点,由ws://.../mediador提供,另一个作为JSF托管bean,由#{mediador}提供。@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会话和视图范围,并且希望能够在推送期间针对特定用户,则当然不是。您最好查看现有的推送组件。另请参阅服务器如何将异步更改推送到JSF创建的HTML页面?

最新更新