JAX-WS要求传输的所有类都有一个默认的构造函数(no-arg构造函数)。我不明白这个要求,因为客户端基于WSDL创建自己的类。 IMO此要求仅适用于那些用作Webservice的输入参数的类。
有谁知道如何规避这一要求?
答案 0 :(得分:6)
使用 JAX-WS 时,您正在使用 JAXB 实现将Java对象序列化为 XML 。
因此,“问题”是JAXB的工作方式。
要使用 JAXB ,您需要创建一个 JAXBContext ,将所有可以编组/解组的类传递给它。在创建上下文时, JAXB 将检查所有给定的类是否具有无参数构造函数。如果这些类中至少有一个没有这种构造函数,则不会创建上下文。
为什么 JAXB 这样做?只有在从XML转换为Object(解组)时才需要这个no-arg构造函数,但问题是当你创建上下文时,JAXB不知道你想做什么(编组或解组)!
结论: JAXB只接受可以编组和解组的类。更多信息here
知道这一点,JAX-WS会发生什么?
当您声明@WebMethod
参数和返回值时,类将被添加到JAXB上下文中。因此,所有与Web服务输入和输出相关的类都需要一个无参数构造函数。
结论:是JAXB错误; - )
但是如果我需要使用没有no-arg构造函数的类呢?
您可以使用 XMLAdapter !查看this post了解详情......
答案 1 :(得分:0)
有谁知道如何规避这一要求?
是 - 重写JAX-WS。
它可能使用默认的ctor和反射来填充对象,因为它不能轻易地知道像你这样的人可能写的每一个可能的ctor。
这是使用别人框架的一个缺点:你必须遵守他们的规则。
客户端基于WSDL创建自己的类
我认为这是图书馆帮助客户做的事情。您没有编写解析和解释WSDL的代码,是吗?