为什么JAX-WS导出的对象需要默认构造函数?

时间:2012-07-11 09:53:55

标签: java xml jaxb jax-ws jax-ws-customization

JAX-WS要求传输的所有类都有一个默认的构造函数(no-arg构造函数)。我不明白这个要求,因为客户端基于WSDL创建自己的类。 IMO此要求仅适用于那些用作Webservice的输入参数的类。

有谁知道如何规避这一要求?

2 个答案:

答案 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的代码,是吗?