我需要将Web服务应用程序从Tomcat 6(使用JDK 1.5)迁移到Tomcat 7(使用JDK 1.6)(实际上在7.0.27上进行测试)。 JAX-WS框架是Metro 2.1。
我正在使用两个ServletContextListeners:
“WebAppListener”:初始化应用程序(配置,设置数据库连接......)。
“com.sun.xml.ws.transport.http.servlet.WSServletContextListener”:创建Web服务的Metro侦听器。
顺序很重要,因为在我的Web服务上调用@PostConstruct方法之前,我需要完全初始化我的Web应用程序。
在Tomcat 6中,这非常有效:
INFO: Starting Servlet Engine: Apache Tomcat/6.0.36
mars 16, 2013 5:13:13 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive WSWebApp.war
************************ IN WebAppListener.contextInitialized ***********************
************************ IN WSMyWebService.postConstruct ****************************
在Tomcat 7中完全相同的战争:
mars 16, 2013 6:45:24 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive C:\home\tomcat\webapps\WSWebApp.war
************************ IN WSMyWebService.postConstruct ****************************
************************ IN WebAppListener.contextInitialized ***********************
我认为调用侦听器的顺序是它们在web.xml中出现的顺序?
为什么在Tomcat 7中更改了此订单?但更重要的是:我需要做些什么才能获得“Tomcat6”订单?
感谢。
答案 0 :(得分:0)
这不是关于Listeners的顺序,它是关于servlets spec 3.0的一个新功能,以及你可能正在使用像METRO这样的JAX-WS实现,我想。 在servlets规范3.0(第8.2.4节)中,有一种方法可以将第三方插件或API添加到容器(在本例中为Tomcat),例如JAX-WS,JAX-RS,JSF等实现。它也被称为广告SCI(javax.servlet.ServletContainerInitializer)。 简而言之,METRO JAX-WS jar使用这种方式,因此不必在web.xml描述符文件中添加listener(com.sun.xml.ws.transport.http.servlet.WSServletContextListener)和servlet配置。它使用sun-jaxws.xml文件列出ws端点,并在部署Web应用程序和执行之前实例化ws类,例如,监听器的contextInitialized方法。
为避免这种情况,请按照Tomcat中关于避免SCI机制的说明进行操作:How do I make Tomcat startup faster?
Context元素containerSciFilter上存在一个属性。它可用于禁用通过SCI API插入Tomcat的容器提供的功能:WebSocket支持(在Tomcat 7及更高版本中),JSP支持(在Tomcat 8及更高版本中)。
可以通过查看Tomcat JAR中的META-INF / services / javax.servlet.ServletContainerInitializer文件来检测要过滤的类名。对于WebSocket支持,名称为org.apache.tomcat.websocket.server.WsSci,对于JSP支持,名称为org.apache.jasper.servlet.JasperInitializer。
它适用于JAX-WS,它只使用web.xml配置来部署Web服务。