ServletContextListener не вызывается
Я создаю проект Java EE 7 с помощью плагина Eclipse Maven. Моя проблема заключается в том, что при запуске приложения класс, реализующий SerlvetContextListener, не вызывается. Что вызывает эту проблему?
@WebListener
public class ApplicationContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce)
{
Request request = new HttpRequest(sce);
new Thread (request).start();
HibernateUtil.getSessionFactory();
}
@Override
public void contextDestroyed(ServletContextEvent sce)
{
}
}
web.XML-код:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<listener>com.kyrogaming.AppServletContextListener</listener>
<!-- Jersey Mapping -->
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.kyrogaming.webservices</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<!-- end Jersey Mapping -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
4 ответов
в интернете.xml вам также необходимо указать <listener-class>
.
<listener>
<listener-class>
com.kyrogaming.AppServletContextListener
</listener-class>
</listener>
чтобы подвести итог ответов JNL и Теда Годдарда:
для загрузки контейнера сервлета ServletContextListener (или других прослушивателей, таких как ServletContextAttributeListener или ServletRequestAttributeListener), необходимо сообщить об этом контейнеру. As описано в документах API существует три способа сделать это:
1) объявите его в дескрипторе развертывания (web.XML-код):
<listener>
<listener-class>
com.kyrogaming.AppServletContextListener
</listener-class>
</listener>
2) или аннотировать его с большим вкусом!--14-->@WebListener
(см. "Примечание об аннотациях" ниже)
3) или зарегистрируйте его программно, с помощью методов в ServletContext, таких как addListener ().
примечание об аннотации
метод 1) и 3) всегда будет работать. Для работы метода 2) (аннотации) контейнер сервлета должен быть настроен для сканирования классов в пути к классам, чтобы найти аннотированные классы прослушивателей.
собственные классы webapp (в разделе WEB-INF/classes
) всегда будет сканироваться, поэтому аннотированные классы всегда будут найдены. Однако,библиотеки (банки под WEB-INF/lib
) не будет сканироваться, если веб.xml содержит атрибут metadata-complete="true"
(атрибут по умолчанию имеет значение false
). Вижу Java Servlet Спецификация Версия 3.0, Глава 8, "аннотации" и "подключения".
Итак, чтобы контейнер мог находить аннотированные классы в банках убедитесь, что паутина.наборы xml metadata-complete="false"
, или не задавать его вообще.
обратите внимание, что установка этого может задержать запуск приложения; см., например,что делать с аннотациями после установки metadata-complete= "true" (который разрешил медленный запуск Tomcat 7)? .
к сожалению, это все еще не объясняет, почему ServletContextListener в вопросе не загружен. Обратите внимание, что в интернете.xml в вопросе не metadata-complete
, то есть он по умолчанию:false
, таким образом, сканирование пути к классам включено. Вероятно, есть какая-то другая проблема; этот контрольный список, надеюсь, поможет найти его.
использование метаданных-complete= "false" в web.xml исправил эту проблему для меня.
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="false">
для записи я добавляю еще одну возможную (и довольно порочную) причину ServletContextListener
не вызывается.
это может произойти, когда у вас есть java.lang.LinkageError
, то есть когда вы забыли добавить <scope>provided</scope>
на javax.servlet-api
зависимость.
В таком случае создается экземпляр прослушивателя, но выполняется только статическая часть, а не contextInitialized
и contextDestroyed
методы.
вы обнаружите только при вызове некоторого сервлета, так как ошибка связи не возникает во время прослушивателя экземпляр.