5

JAX-WS 要求传输的所有类都具有默认构造函数(无参数构造函数)。我不理解这个要求,因为客户基于 WSDL 创建自己的类。IMO 此要求仅对用作 Web 服务输入参数的类有意义。

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

4

2 回答 2

7

当您使用JAX-WS时,您正在使用JAXB实现将您的 java 对象序列化为XML

因此,“问题”是 JAXB 的工作方式。

要使用JAXB,您需要创建一个JAXBContext,将所有可以编组/解组的类传递给它。创建上下文时,JAXB将检查所有给定类是否具有无参数构造函数。如果这些类中至少有一个没有这种构造函数,则不会创建上下文。

为什么JAXB这样做?它仅在从 XML 转换为 Object(解组)时才需要此无参数构造函数,但问题是当您创建上下文时,JAXB 不知道您想要做什么(编组或解组)!

结论: JAXB 将只接受它可以编组和解组的类。更多信息在这里

知道了这一点,在 JAX-WS 中会发生什么?

当您声明参数返回值@WebMethod类时,将添加到 JAXB 上下文中。正因为如此,所有与 Web 服务输入和输出相关的类都需要一个无参数构造函数。

结论:是 JAXB 故障 ;-)

但是如果我需要使用一个没有无参数构造函数的类呢?

您可以使用XMLAdapter!检查此帖子以获取更多信息...

于 2012-07-12T15:06:21.300 回答
-2

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

是的 - 重写 JAX-WS。

它可能使用默认 ctor 和反射来填充对象,因为它不能轻易知道像您这样的人可能编写的每个可能的 ctor。

这是使用别人的框架的一个缺点:你必须遵守他们的规则。

客户端基于 WSDL 创建自己的类

我认为这就是图书馆帮助客户做的事情。您没有编写代码来解析和解释 WSDL,是吗?

于 2012-07-11T09:57:21.043 回答