【问题标题】:How to specify both jaxws and jaxb bindings to achieve @XmlRootElement如何同时指定 jaxws 和 jaxb 绑定以实现@XmlRootElement
【发布时间】:2013-11-05 00:46:22
【问题描述】:

我继承了一个与基于 SOAP 的 Web 服务进行通信的项目。我在这方面完全是个菜鸟,虽然我已经做了很多年 Java 并且在 XML 方面做得很好。

我们有一个服务的WSDL 文件,其中包含顶部的架构和下面的所有消息定义内容。问题的核心是,当我尝试通过我们的代码连接到服务时,我得到了可怕的无法编组类型“https.api_blah_com.services.v4.Product”作为元素,因为它缺少@XmlRootElement 注释]

我的项目已经有一个 jaxws 绑定文件:

<jaxws:bindings wsdlLocation="../resources/wsdl/BlahAPI.wsdl"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
  <jaxws:bindings  
    node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='https:api.blah.com/services/v4']">
    <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xjc:generateElementProperty>true</xjc:generateElementProperty>
    </jxb:globalBindings>`
  </jaxws:bindings>
</jaxws:bindings>

现在我已经读到,为了让我的所有 Java 类都使用 @XmlRootElement 生成,我需要添加一个 jaxb:globalBinding 以打开简单模式。

我已尝试将 WSDL 添加到我的本地副本:

<xs:annotation>
  <xs:appinfo>
    <jaxb:globalBindings>
      <xjc:simple />
    </jaxb:globalBindings>
  </xs:appinfo>
</xs:annotation>

但是JAXB 编译器抱怨它不能接受这个 globalBindings 自定义,因为它附加到错误的位置或与其他绑定不一致。

所以我尝试为 jaxb 添加另一个绑定文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
    <jaxb:globalBindings>
      <xjc:simple />
    </jaxb:globalBindings>
  </jaxb:bindings>
</jaxb:bindings>

然后我收到一个错误,即 blah.wsdl 不是此编译的一部分。

我非常接近调用此服务...我只是无法克服这件事,而且这对我来说是全新的,所以我不确定还能尝试什么。

我可以将他们的WSDL 拆分为XSDWSDL?是否需要这样做?

【问题讨论】:

    标签: web-services jaxb wsdl jax-ws cxf


    【解决方案1】:

    不确定 JAXB 绑定是否配置正确。如果类构成元素结构的根,则需要 @XmlRootElement。但是在 SOAP 中,SOAP 元素将形成 XML 的根,因此检查您的 ObjectFacory.java 类是否已生成,如果生成,请验证是否为返回类类型实例的类类型创建了一个方法,例如您有 @987654322 @ 一个返回 Foo 实例的方法 `public Foo createFoo() 应该存在于您的 ObjectFoacory.java 中

    但是,我建议您在启用客户端选项的情况下使用 CXF 提供的 WSDL2java this。配置客户端代码需要几分钟时间

    【讨论】:

      【解决方案2】:

      我认为您必须在此位置绑定 xsd 文件而不是 wsdl。 &lt;jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl"&gt;。请参阅link 的“外部绑定自定义文件”部分。

      【讨论】:

        猜你喜欢
        • 2018-04-06
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-10
        相关资源
        最近更新 更多