JAX-WS Webapp 的部署错误

Deployment Error for JAX-WS Webapp

这里有点奇怪,我完全被挡住了。

我有一个 Web 应用程序,带有一些 JAX-WS 注释 类。此外,在部署 webapp 时,会使用 web.xml 中的侦听器 ThirdPartyContextListener 初始化第三方框架。到目前为止,一切都很好。 (有关信息,该框架负责 ORM、缓存和数据持久化。)

当我的一些 JAX-WS 类 需要使用该框架时,问题就开始了。似乎框架还没有足够早地初始化(通过 ThirdPartyContextListener)。就像,当 Web 服务 类 被实例化时,ThirdPartyContextListener 似乎还没有被调用。

监听器在我的 web.xml 中的顺序肯定是正确的,所以我希望我的 ThirdPartyContextListener 是第一个被执行的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>

    ... stuff here ...

    <listener>
        <listener-class>ThirdPartyContextListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>WSServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>WSServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    ... stuff here also ...

</web-app>

所以我有几个问题:

不幸的是,我无法真正提供代码示例(我工作场所的安全限制)。

非常感谢!

我注意到我的日志中有以下几行:

Caused by: com.sun.xml.ws.transport.http.servlet.WSServletException: WSSERVLET11: failed to parse runtime descriptor: java.lang.NullPointerException
    at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.parseAdaptersAndCreateDelegate(WSServletContextListener.java:141)
    at com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer.onStartup(WSServletContainerInitializer.java:65)

所以 JAX-WS 似乎在 listeners 被击中之前做了一些工作;从外观上看,它正在为我定义的每个服务端点创建委托。我相当确定您不能更改 XxxxContainerInitializer 的顺序,因此我查看了其他替代方法。其中之一是使用 spring 来管理网络服务。

这需要更多的 JAR,其中一些与我们起诉的第三方框架冲突。这很快使我们的解决方案变得有点 复杂...所以我不再试图变得聪明,而是使用惰性单例。

(听起来很糟糕,但它更适合我们,因为无论如何每个服务调用都需要调用第三方框架。)