使用JAX-WS的XML序列化问题

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

2
我猜您指的是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中遇到了这些问题),我为每个choiceelement设置了一个唯一的name。在理解了基本思想后,这很容易实现 ;) - no id
不用客气。当然,在这里使用一个独特的“名称”是有意义的。 - joergl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接