Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JAX-WS在使用JAXB数据绑定部署任何服务时都会冻结?_Java_Maven_Jaxb_Jax Ws_Java Metro Framework - Fatal编程技术网

Java 为什么JAX-WS在使用JAXB数据绑定部署任何服务时都会冻结?

Java 为什么JAX-WS在使用JAXB数据绑定部署任何服务时都会冻结?,java,maven,jaxb,jax-ws,java-metro-framework,Java,Maven,Jaxb,Jax Ws,Java Metro Framework,我正在尝试创建一个JAX-WS服务,它使用JAXB数据绑定从非常大的(900多个类)数据集生成的对象 我能够成功地在各种servlet容器(Jetty、Tomcat6/7等)上部署包含JAX-WS服务的war(使用适当的web.xml和sun jaxws.xml),只要我的web方法不引用任何JAXB对象。例如,这项工作: @WebService(serviceName = "OTAService", targetNamespace = "http://www.opentravel.org/O

我正在尝试创建一个JAX-WS服务,它使用JAXB数据绑定从非常大的(900多个类)数据集生成的对象

我能够成功地在各种servlet容器(Jetty、Tomcat6/7等)上部署包含JAX-WS服务的war(使用适当的web.xml和sun jaxws.xml),只要我的web方法不引用任何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 + "!";
    }
}
但是,如果我通过添加
@xmlseea
注释或直接引用对象将web方法更改为使用JAXB数据绑定,那么我尝试过的所有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-WSAPI以及运行时JAR,都存在于war的/lib目录中

包含我的JAXB对象的jar是我的JAX-WS项目所必需的依赖项,可以通过在上运行
mvn clean install
来创建并安装到本地repo

我的JAX-WS项目是可用的,可以通过调用
mvn clean package Jetty:run war
在Jetty中运行


您会注意到,如果只存在简单的
sayHello
方法,Jetty就会立即启动。但是,如果您取消对JAXB方法的注释,Jetty和我尝试过的所有其他servlet容器将在尝试实例化JAX-WSservlet时永远挂起有人能解释为什么使用JAXB数据绑定的web方法会阻止部署my war吗?由于冻结行为在各种servlet容器上都是相同的,我觉得一定有一些关键的步骤我遗漏了;但是,由于没有报告错误,容器启动只是挂起,我不知道如何继续。

这似乎是由于我的opentravel项目中有大量JAXB对象。当我将VisualVM连接到启动程序进程并对内存进行采样时,看起来JAXB似乎出于某种原因正在遍历和预加载/缓存整个对象树(可能是为了重建模式以包含在WSDL中?)

设置
-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true
,并使用
-Xmx1024m-XX:PermSize=256m-XX:MaxPermSize=512m
快速启动Jetty

我还不确定运行时性能的下降是否是一个可接受的折衷方案