Servlets Servlet url模式-Servlet上下文中的java.lang.NullPointerException

Servlets Servlet url模式-Servlet上下文中的java.lang.NullPointerException,servlets,asynchronous,servletconfig,Servlets,Asynchronous,Servletconfig,我的servlet执行三项任务: 当它收到消息“resourceupdate”时,将请求的资源(HTML页面)存储到对象sharedClient 当它接收到异步get(由“t=UPDATE”指示的querystring)时,会将对象sharedClient添加到此请求挂起 当它接收到传递时,资源(由pathinfo myServlet/sharedsessionID指示-例如myServlet/8439jfndofsd93jcanjc)执行资源的分派 这是我的Web.xml: <servl

我的servlet执行三项任务:

当它收到消息“resourceupdate”时,将请求的资源(HTML页面)存储到对象sharedClient

当它接收到异步get(由“t=UPDATE”指示的querystring)时,会将对象sharedClient添加到此请求挂起

当它接收到传递时,资源(由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>
现在的问题是: 在我执行resourceupdate之前,servlet可以正常工作,但是当我执行资源交付(到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
if(resourceUri!=null){
字符串ssid=resourceUri.substring(1);
ConcurrentHashMap hmClients=(ConcurrentHashMap)this.getServletConfig().getServletContext().getAttribute(“SharedClient”);
if(hmClients.containsKey(ssid)){
SharedClient targetClient=hmClients.get(ssid);
如果(targetClient.getParticipantSession().containsKey(会话)){
copy(targetClient.streamSnapshot(),response.getOutputStream());
}
}else System.out.println(“hmClient不包含ssid”);//始终在此分支中
从这时起,异步get的长轮询也没有成功完成

如果在更新之后我没有将资源传递到myServlet/sharedsessionID类型的路径,则异步get将继续正常工作

谢谢大家。

好的,我决定了

我需要写信

 @WebServlet(urlPatterns = {"/myServlet/*"}, asyncSupported=true)
在myServlet声明之前

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
 @WebServlet(urlPatterns = {"/myServlet/*"}, asyncSupported=true)