2014-11-14 45 views
0

的狀態,我旁邊的WebSocket接口的ServletContextListener不救的ServletContext

@ServerEndpoint(value="/list") 
public class WebSocketList implements ServletContextListener { 

private ServletContextEvent sce; 

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    System.out.println("contextInitialized"); 
    this.sce = sce; 
} 

@OnMessage 
public void receiveMessage(ByteBuffer bb, Session sn) { 
    if (sce == null) 
     System.out.println("not good"); 
} 

文件的beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="annotated"> 
</beans> 

在調試對象ServletContextEvent的方法contextInitialized是不爲空,但是當我接收來自客戶端的消息(在方法receiveMessage中),總是記錄「不好」 - 對象ServletContextEvent爲空。

UPDATE:當我在這兩種方法中添加System.out.println(this),記錄下一個 -

[email protected] 
[email protected] 
+1

在這兩種方法中,添加'的System.out.println(本)'。 –

+0

我來更新信息 – user1755546

+0

請注意他們是如何不同的對象。 –

回答

0

我剛剛碰到同樣的問題,如@Sotirios提到的,問題是,receivedMessage(ByteBuffer, Session)上調用與contextInitialized(ServletContextEvent)不同的對象。

解決這個問題的一種方法是使您的private ServletContextEvent sce字段靜態,但我懷疑這樣做可能會導致上下文停止或重新加載時出現問題。更好的方法是從sce事件中提取所需的所有信息並將其存儲在一個或多個對象字段中。

在我來說,我所需要的存儲是當前servlet上下文的路徑,所以我就這樣做:

private static String path; 

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    this.path = sce.getServletContext().getContextPath(); 
}