我使用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>
答案 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
依赖项时。
在这种情况下,会创建侦听器实例,但只执行静态部分,而不是contextInitialized
和contextDestroyed
方法。
只有在调用某个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>