Web服务的PostConstruct在servlet上下文侦听器的contextInitialized之前调用

时间:2013-03-16 18:10:48

标签: web-services migration jax-ws tomcat7 tomcat6

我需要将Web服务应用程序从Tomcat 6(使用JDK 1.5)迁移到Tomcat 7(使用JDK 1.6)(实际上在7.0.27上进行测试)。 JAX-WS框架是Metro 2.1。

我正在使用两个ServletContextListeners:

  1. “WebAppListener”:初始化应用程序(配置,设置数据库连接......)。

  2. “com.sun.xml.ws.transport.http.servlet.WSServletContextListener”:创建Web服务的Metro侦听器。

  3. 顺序很重要,因为在我的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”订单?

    感谢。

1 个答案:

答案 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服务。