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 методы.

вы обнаружите только при вызове некоторого сервлета, так как ошибка связи не возникает во время прослушивателя экземпляр.