【问题标题】:Why is a default constructor required for objects exported by a JAX-WS?为什么 JAX-WS 导出的对象需要默认构造函数?
【发布时间】:2012-07-10 21:58:40
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    所以,“问题”在于 JAXB 的工作方式。

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

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

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

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

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

    结论: 是 JAXB 故障 ;-)

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

    您可以使用 XMLAdapter!查看this post了解更多信息...

    【讨论】:

    • 所以问题似乎是 JAXB 没有区分它必须编组或解组的类。如果支持此功能,则 JAX-WS 可以构建相应的 JAXBContext。我认为这会对即将到来的 JAXB 规范提出很好的功能要求。
    • 我非常同意你的看法。实际上,来自 MOXy(EclipseLink 的 JAXB 实现)的人有一张开放的票来添加多参数构造函数支持:bugs.eclipse.org/bugs/show_bug.cgi?id=328951
    【解决方案2】:

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

    是的 - 重写 JAX-WS。

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

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

    客户根据 WSDL 创建自己的类

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

    【讨论】:

    • 对象不能由服务器端的 JAX-WS 填充。 JAX-WS 只传输它们。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2012-12-25
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多