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

时间:2012-12-04 13:48:11

标签: servlets asynchronous servletconfig

我的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");

我以这种方式获得具有特定SharedSessionID的SharedClient:

SharedClient targetClient = hmClients.get(ssid);

现在的问题是: 直到我做一个resourceupdate servlet工作正常,但是当我执行delivery_resource(到一个类型为myServlet / sharedsessionID的路径)时,servlet无法获取sharedClient引用,并且我得到一个Null Pointer Exception。

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

此时,异步get的长轮询也未成功完成。

如果我在更新后没有将delivery_resource发送到myServlet / sharedsessionID类型的路径,则异步get继续正常运行。

感谢所有人。

1 个答案:

答案 0 :(得分:0)

好吧,我解决了。

我需要写

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

在myServlet声明之前。