Шаблон 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.