我正在开发一个实时应用程序。我有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页面?