2012-07-11 80 views
5

JAX-WS要求所有传输的类都有一个默认的构造函数(无参数构造函数)。我不明白这一要求,因为客户端基于WSDL创建了自己的类。 IMO此要求仅适用于那些用作Web服务的输入参数的类。为什么JAX-WS导出的对象需要默认构造函数?

有谁知道如何绕过这个要求?

回答

6

当您使用JAX-WS您使用的是JAXB实现序列化Java对象到XML

所以,'问题'是JAXB的工作原理。

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

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

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

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

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

结论:是JAXB故障;-)

但是,如果我需要使用不具有一个无参数的构造函数的类是什么?

您可以使用XMLAdapter!有关更多信息,请检查this post ...

+0

所以这个问题似乎是JAXB没有区分它需要编组或解组的类。如果支持此功能,则JAX-WS可以构建相应的JAXBContext。我认为这会为即将到来的JAXB规范提出一个很好的功能要求。 – Stefan 2012-07-13 06:27:06

+0

我非常同意你的看法。实际上,来自MOXy的人(由EclipseLink实现的JAXB)有一个公开票证来添加多参数构造器支持: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328951 – ggarciao 2012-07-13 07:59:12

0

有谁知道如何绕过这个要求?

是 - 重写JAX-WS。

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

这是使用别人的框架的缺点:你必须按照他们的规则玩。

客户基于WSDL

我以为这就是图书馆帮助客户做创建自己的类。您没有编写代码来解析和解释WSDL,是吗?

+0

对象不得由服务器端的JAX-WS填充。 JAX-WS只传输它们。 – Stefan 2012-07-11 10:00:19

相关问题