2015-05-19 22 views
2

我正在开发一个实时应用程序。我有websockets和应用程序范围的托管bean。我试图从websocket访问应用程序范围的托管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类脱托管属性“aplicacion”它是空的,所以我得到一个NullPointerException。

谢谢

+1

你试过了吗?你有错误吗?你使用的是JSF bean管理还是CDI? –

+0

我编辑了我的帖子,其中包含更多信息代码 – Jaime

+0

我正在使用JSF bean管理。我应该使用CDI吗? – Jaime

回答

2

这真的是不对的。

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

WS(JSR-356 WebSocket)API和JSF API是完全独立的。他们互不知情,不会将相互混淆的注释考虑在内。

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

改为使用CDI。它适用于整个Java EE Web应用程序。不仅在WebSocket端点中,而且在JSF管理的bean,WebServlets,WebFilters,WebListeners,JAX-RS资源,JAX-WS资源等等中。最终,JSF托管bean设施将被弃用,以支持CD​​I。这将在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正确不完全微不足道的,肯定不是,如果你” d喜欢考虑JSF会话和视图范围,并希望能够在推送期间针对特定用户。你最好看看现有的推送组件。另请参见How can server push asynchronous changes to a HTML page created by JSF?

+0

好吧,我已经做了这些修改,但是当运行websocket代码时,注入的字段aplicacion为空。我已经激活CDI,在我的WEB-INF文件夹中创建一个空的beans.xml。是不正确的?谢谢 – Jaime

+0

顺便说一下,我正在使用Tomcat 8.0.15 – Jaime

+0

我的Java EE版本是Java EE 7 Web,我已阅读https://netbeans.org/kb/docs/javaee/cdi-intro.html以下内容: “如果您将Java EE 7 Web指定为Java EE版本,则缺省情况下会启用CDI 1.1,并启用bean。xml文件不是必需的“,所以我删除了beans.xml文件,它仍然不起作用 – Jaime

相关问题