2015-05-19 20 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

相關問題