我使用Eclipse插件创建了一个Java 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>
</web-app>发布于 2013-08-21 21:00:06
在web.xml中,还需要指定<listener-class>。
<listener>
<listener-class>
com.kyrogaming.AppServletContextListener
</listener-class>
</listener>发布于 2016-04-12 08:26:34
总结JNL和Ted Goddard的回答:
若要由servlet容器加载ServletContextListener (或其他侦听器,如ServletContextAttributeListener或ServletRequestAttributeListener),需要将其告知容器。作为在API文档中描述。,有三种方法可以做到这一点:
@WebListener注释其类(请参阅下面的“关于注释的注意事项”)关于注释的注记
方法1)和方法3)总是有效的。要使方法2(注释)工作,servlet容器必须配置为扫描类路径中的类,以找到带注释的侦听器类。
如果WEB-INF/classes**)包含属性** metadata-complete="true" (属性默认为false),则不会扫描webapp自己的类(在和库下( web.xml下的JAR))。请参阅Java规范3.0版,第8.1章,“注释和可插拔性”。
在web应用程序中,使用注释的类只有在它们位于within / classes目录中或打包到位于应用程序内的within/lib的jar文件中时才会被处理。web应用程序部署描述符在web-app元素上包含一个新的“元数据完整”属性。“元数据-完整”属性定义web描述符是否完整,或者是否应该在部署时检查jar文件的类文件中的注释和web片段。如果“元数据完整”设置为"true",则部署工具必须忽略应用程序的类文件和web片段中存在的任何servlet注释。如果未指定元数据完整属性或将其设置为"false",则部署工具必须检查应用程序的类文件以获得注释,并扫描web片段。
因此,要允许容器在JAR中找到带注释的类,请确保web.xml设置metadata-complete="false",或者根本不设置它。
请注意,设置此设置可能会延迟应用程序的启动;例如,请参见在设置元数据完成=“true”(这解决了Tomcat 7启动的缓慢问题)之后,如何处理注释呢?。
不幸的是,这仍然不能解释为什么问题中的ServletContextListener没有加载。注意,问题中的web.xml并不是metadata-complete,这意味着它默认为false,因此启用了类路径扫描。可能还有其他一些问题;希望这个清单有助于找到它。
发布于 2014-03-03 17:43:07
在web.xml中使用元数据-complete=“false”为我解决了这个问题。
<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">https://stackoverflow.com/questions/18367514
复制相似问题