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>
所以我有几个问题:
- 为什么 JAX-WS 类 实例化这么早? (或者至少这样看)
- 有没有办法强制首先初始化框架
不幸的是,我无法真正提供代码示例(我工作场所的安全限制)。
非常感谢!
我注意到我的日志中有以下几行:
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,其中一些与我们起诉的第三方框架冲突。这很快使我们的解决方案变得有点 太 复杂...所以我不再试图变得聪明,而是使用惰性单例。
(听起来很糟糕,但它更适合我们,因为无论如何每个服务调用都需要调用第三方框架。)
这里有点奇怪,我完全被挡住了。
我有一个 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>
所以我有几个问题:
- 为什么 JAX-WS 类 实例化这么早? (或者至少这样看)
- 有没有办法强制首先初始化框架
不幸的是,我无法真正提供代码示例(我工作场所的安全限制)。
非常感谢!
我注意到我的日志中有以下几行:
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,其中一些与我们起诉的第三方框架冲突。这很快使我们的解决方案变得有点 太 复杂...所以我不再试图变得聪明,而是使用惰性单例。
(听起来很糟糕,但它更适合我们,因为无论如何每个服务调用都需要调用第三方框架。)