我正在尝试创建一个 JAX-WS 服务,该服务使用从非常大(900 多个类)的Opentravel Alliance 模式集生成的对象的 JAXB 数据绑定。
只要我的 web 方法不引用,我就能够在各种 servlet 容器(Jetty、Tomcat6/7 等)上成功部署包含我的 JAX-WS 服务的战争(使用正确的 web.xml 和 sun- jaxws.xml)我的任何 JAXB 对象。例如,这有效:
@WebService(serviceName = "OTAService",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class OTAService {
public String sayHello(final String name) {
return "Hello " + name + "!";
}
}
但是,如果我通过添加注释或直接引用对象来更改 web 方法以使用 JAXB 数据绑定,@XmlSeeAlso
我尝试过的所有 servlet 容器都会无限期挂起(1 小时以上),没有错误,并且永远不会启动:
@WebService(serviceName = "OTAService",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({OTAHotelResNotifRQ.class, OTAHotelResNotifRS.class})
public class OTAService {
@Action(input = "OTA_HotelResNotif")
@WebMethod(operationName = "OTA_HotelResNotif", action = "OTA_HotelResNotif")
public @WebResult OTAHotelResNotifRQ tokenizeOtaHotelResNotifRq(
@WebParam(partName = "OTA_HotelResNotifRQ", name = "OTA_HotelResNotifRQ",
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
final OTAHotelResNotifRQ request) {
return request;
}
}
我已经验证了所有必要的 jar,包括 JAXB 和 JAX-WS API 以及运行时 jar,都存在于 war 的 /lib 目录中。
包含我的 JAXB 对象的 jar 是我的 JAX-WS 项目所需的依赖项,可以通过mvn clean install
在此项目上运行来创建并安装到本地存储库。
我的 JAX-WS 项目(可在此处获得)可以通过调用mvn clean package jetty:run-war
.
sayHello
您会注意到,如果仅存在简单方法,Jetty 就会立即启动。但是,如果您取消注释 JAXB 方法,Jetty 和我尝试过的所有其他 servlet 容器将在尝试实例化 JAX-WS servlet 时永远挂起。 有人可以解释为什么带有 JAXB 数据绑定的 Web 方法会阻止我的战争部署吗?由于在各种 servlet 容器上的冻结行为是相同的,我觉得肯定有一些我遗漏的关键步骤;但是,由于没有报告错误并且容器启动只是挂起,我不知道如何继续。