【问题标题】:Why does wsimport have trouble with server object having @XmlRootElement annotation?为什么 wsimport 对具有 @XmlRootElement 注释的服务器对象有问题?
【发布时间】:2013-01-03 23:46:48
【问题描述】:

我正在使用服务器端的 JAX-WS 完成 Web 服务的工作。在许多域对象中,我使用了@XmlRootElement 来帮助促进使用 JAXB 将 XML 文件解组到服务中。一切顺利,输出是我使用 SoapUI 所期望看到的。

但是,当我使用 wsimport 创建客户端(作为其他开发人员的便利 DAO)时,我开始在客户端集成测试类中遇到 NullPointerExceptions。

对 web 服务的调用正常工作,并且客户端收到了响应,但我的更复杂的对象为空。简单的属性,比如字符串,返回的都是可用的数据,而不是更大的对象。

通过使用简单字符串重新创建服务并迁移到更复杂的对象的迭代,我发现当客户端收到在服务器上用@XmlRootElement 声明的对象时,这些对象是空的。如果服务器对象没有 @XmlRootElement 注释,则客户端会收到所有复杂荣耀中的所有数据。

最初缺少@XmlRootElement 让我很适合解组服务器上的数据,但this answer 帮助了我。

因此,由于@XmlRootElement 注释(在服务器上!),wsimport 客户端在 Web 服务响应的解组时静默失败的现象让我很担心。在这种情况下,我可以控制双方并且可以做点什么。但是,如果我无法控制服务器怎么办?我将如何仅使用 wsimport 生成的代码来解决这个问题?

【问题讨论】:

    标签: java jaxb jax-ws xjc wsimport


    【解决方案1】:

    找到答案或原因,所以想我会分享。

    @XmlRootElement 注释对于普通的 JAXB 绑定很有用,但是当对象(和生成的 XML)被打包为 SOAP 响应时,它们可能与 WSDL 不完全匹配s 数据的表示取决于其他注释的值。

    通过@WebMethod 方法返回的服务器上的类上的@XmlRootElement 注释,WSDL 将包含一个元素定义,例如:

    <xs:element name="foo" type="tns:FooType"/>
    

    然后您的WSDL 将在其他地方包含对元素的引用,例如:

    <xs:seqeunce>
    <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:foo"/>
    </xs:sequence>
    

    这种引用是由 @XmlRootElement 注释引起的,与 SOAP 响应的实际 XML 相比,可能会混淆根元素声明的意图。

    相比之下,在服务器对象上没有@XmlRootElement 注释而生成的WSDL 根本不包含&lt;xs:element name="foo"/&gt; 声明。相反,它的元素被描述为:

    <xs:sequence>
    <xs:element maxOccurs="unbounded" minOccurs="0" name="foo" type="tns:FooType"/>
    </xs:sequence>
    

    这可能更好地匹配 SOAP 响应 XML 的表示方式,并且将 XML 解组到 wsimport 生成的类中工作得很好。

    如何在JAX-WS 服务中使用@XmlRootElement

    wsimport 似乎处理了服务返回的 XML 有效性的某种程度的惰性。吸取的教训是,在描述 Web 服务方法的 @WebResult 注释上勤奋使用 nametargetNamespace@XmlRootElement 注解需要匹配targetNamespace 中的name。当它们都匹配时,解组按预期进行。当这些值不匹配时,由wsimport 生成和注释的存根类将无法正确使用 XML。

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2020-10-20
      • 2018-11-01
      相关资源
      最近更新 更多