2012-12-04 31 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) 

相关问题