ServletContextListener未被调用

时间:2013-08-21 20:54:53

标签: servlets servlet-listeners

我使用Eclipse Maven插件创建Java EE 7项目。我的问题是当我运行应用程序时,实现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>

5 个答案:

答案 0 :(得分:12)

使用metadata-complete =&#34; false&#34;在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">

答案 1 :(得分:4)

在web.xml中,您还需要指定<listener-class>

    <listener>
        <listener-class>
                 com.kyrogaming.AppServletContextListener
        </listener-class>
    </listener>

答案 2 :(得分:2)

为了记录,我添加了另一个可能(而且相当恶性)ServletContextListener未被调用的原因。

当您有java.lang.LinkageError时就会发生这种情况,即忘记将<scope>provided</scope>添加到javax.servlet-api依赖项时。 在这种情况下,会创建侦听器实例,但只执行静态部分,而不是contextInitializedcontextDestroyed方法。

只有在调用某个servlet时才会发现,因为在侦听器实例化期间不会引发链接错误。

答案 3 :(得分:0)

正在运行的容器可能需要明确允许扫描注释:

码头前:

cd [JETTY_BASE]
java -jar [JETTY_HOME]/start.jar --add-module=annotations

答案 4 :(得分:0)

还有另一种极为罕见的情况会导致这种情况。 (我花了 4 个小时才发现)

如果您使用的是 Tomcat10,则不能在您的 maven/gradle 中使用 javax.servlet 库。

Tomcat9 仍然有 javax.servlet,但 Tomcat10 迁移到了 jakarta.servlet

Tomcat10 期望有使用 jakarta.servlet.ServletContextListener 的 Listener 类

所以使用这个maven依赖:(提供了scope,因为Tomcat10已经有了这样的库)

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>5.0.0</version>
            <scope>provided</scope>
        </dependency>