Шаблон URL сервлета - исключение java.lang.NullPointerException в контексте сервлета

Мой сервлет выполняет три задачи:

При получении сообщения "resourceupdate" сохраняет запрошенный ресурс (HTML-страницу) для объекта sharedClient.

Когда он получает асинхронное получение (строка запроса, обозначенная как "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 работает нормально, но когда я делаю delivery_resource (к пути типа myServlet/sharedsessionID), сервлет не может получить ссылку на 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 после обновления, асинхронное получение продолжает функционировать должным образом.

Спасибо всем.

1 ответ

Решение

Хорошо, я решил.

мне нужно написать

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

до объявления myServlet.

Другие вопросы по тегам