【问题标题】:XML sequence with JAX-WS使用 JAX-WS 的 XML 序列
【发布时间】:2013-02-01 08:37:39
【问题描述】:

有没有办法让 JAX-WS 生成的默认 WSDL(通过 ?wsdl 返回)使用 XML choice 而不是 anysequence

【问题讨论】:

    标签: wsdl jax-ws code-generation


    【解决方案1】:

    我假设您指的是 WSDL 的 <types/> 部分中的 XML 模式。此模式的生成不受 JAX-WS 管理,而是由 JAXB 规范管理。这是 JAX-WS 中数据绑定的规范。

    但要真正回答您的问题:是的,您可以在代表您的数据类型的类中使用适当的 @XMLElements 注释来做到这一点。例如,采用这样的 Web 服务接口:

    @WebService
    public interface Chooser {
    
        String chooseOne(Choice myChoice);
    
    }
    

    那么您的 XSD 的内容取决于 Choice 类的结构。您可以通过以下方式强制生成 choice 元素:

    public class Choice {
    
        @XmlElements(value = { @XmlElement(type = First.class),
                @XmlElement(type = Second.class) })
        private Object myChoice;
    
    }
    

    FirstSecond 类是选项中的可能元素。此代码生成的架构如下所示:

    <xs:complexType name="choice">
      <xs:sequence>
        <xs:choice minOccurs="0">
          <xs:element name="myChoice" type="tns:first"></xs:element>
          <xs:element name="myChoice" type="tns:second"></xs:element>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
    

    这仍然将choice 包裹在sequence 中,但由于sequence 中只有一个元素,这并不重要。

    【讨论】:

    • 感谢您的出色解决方案!为了避免解析问题(在 SoapUI 上遇到了),我为 choice 中的每个 element 放置了一个唯一的 name。在理解了基本思想之后,这很容易;)
    • 不客气。当然,在这里使用唯一的name 是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2014-03-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多