2012-12-04 29 views
0

我的servlet執行三項任務:服務器URL模式 - 顯示java.lang.NullPointerException在servlet上下文

當它收到消息「resourceupdate」商店所請求的資源(HTML頁面)爲對象sharedClient。

當它接收到異步get(由「t = UPDATE」指示的查詢字符串)時,將該對象sharedClient添加此請求掛起。

當它收到delivery_resource(由pathinfo myServlet/sharedsessionID指示 - 例如myServlet/8439jfndofsd93jcanjc)執行資源調度時。

這是我的web.xml:

<servlet> 
    <description></description> 
    <display-name>MyServlet</display-name> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>it.package.MyServlet.MyServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet/*</url-pattern> 
</servlet-mapping> 

我把所有的積極SharedClients這樣:

ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>) this.getServletConfig().getServletContext().getAttribute("sharedClients"); 

我也得到了SharedClient在這樣一個特定的SharedSessionID:

SharedClient targetClient = hmClients.get(ssid); 

現在的問題: 直到我做了一個resourceupdate servlet工作正常,b當我做一個delivery_resource(到類型爲myServlet/sharedsessionID的路徑)時,servlet無法獲得sharedClient引用,並且我得到一個空指針異常。

if (resourceUri!=null) { 
String ssid = resourceUri.substring(1); 
ConcurrentHashMap<String, SharedClient> hmClients = (ConcurrentHashMap<String, SharedClient>) this.getServletConfig().getServletContext().getAttribute("sharedClients"); 
if (hmClients.containsKey(ssid)) { 
    SharedClient targetClient = hmClients.get(ssid); 
    if (targetClient.getParticipantSession().containsKey(session)) { 
    IoUtils.copy(targetClient.streamSnapshot(), response.getOutputStream()); 
     } 
} else System.out.println("hmClient do not contains ssid"); //always in this branch 

從此時間開始,異步獲取的長輪詢也沒有成功完成。

如果在更新之後,我沒有將delivery_resource傳遞給myServlet/sharedsessionID類型的路徑,那麼異步get將繼續正常運行。

感謝所有。

回答

0

好的,我解決了。

我需要myServlet聲明之前寫

@WebServlet(urlPatterns = {"/myServlet/*"}, asyncSupported=true) 

相關問題