Клиент WebService и список> - PullRequest
       27

Клиент WebService и список>

3 голосов
/ 26 августа 2011

Когда я пытаюсь сгенерировать клиента из документа wsdl, я получаю клиента, который, похоже, имеет много атрибутов JAXBElement, например

protected List<JAXBElement<?>> nameOrLinkingNameOrFamilyName;

Я использую soapUI для генерации с Apache CXF 2.3.3 в качестве инструмента, а также в качестве файла конфигурации:

<jaxb:bindings version="2.1"
 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:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

Насколько я понял, это связано с тегами choice в документе wsdl.

заранее спасибо

1 Ответ

6 голосов
/ 26 августа 2011

A JAXBElement будет сгенерировано для свойств выбора, где несколько элементов XML будут соответствовать одному и тому же классу Java.Это делается для того, чтобы сохранить информацию об элементе, поскольку ее нельзя извлечь из типа значения.

binding.xml

Следующий файл привязок схемы JAXBобеспечит генерацию свойства выбора:

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          version="2.1">
    <globalBindings choiceContentProperty="true"/>
</bindings> 

XML-схема, которая будет производить Object Свойство

В этой версии XML-схемы все элементы XML будут соответствовать другому классу Java:

<xsd:choice>
    <xsd:element name="address" type="address"/>
    <xsd:element name="phone-number" type="phoneNumber"/>
    <xsd:element name="note" type="xsd:string"/>
</xsd:choice>

Поскольку значение свойства choice достаточно для однозначной идентификации элемента, свойство не содержит JAXBElement для сохранения этой информации:

@XmlElements({
    @XmlElement(name = "address", type = Address.class),
    @XmlElement(name = "phone-number", type = PhoneNumber.class),
    @XmlElement(name = "note", type = String.class)
})
protected Object addressOrPhoneNumberOrNote;

XML-схема, которая будет производить JAXBElement Свойство

Теперь мы изменим структуру выбора так, чтобы методы note и email соответствовали Stringclass.

<xsd:choice>
    <xsd:element name="address" type="address"/>
    <xsd:element name="phone-number" type="phoneNumber"/>
    <xsd:element name="note" type="xsd:string"/>
    <xsd:element name="email" type="xsd:string"/>
</xsd:choice>

Поскольку значение свойства выбора больше не является достаточным для однозначной идентификации элемента, свойство должно содержать JAXBElement для сохранения этой информации:

@XmlElementRefs({
    @XmlElementRef(name = "phone-number", type = JAXBElement.class),
    @XmlElementRef(name = "email", type = JAXBElement.class),
    @XmlElementRef(name = "address", type = JAXBElement.class),
    @XmlElementRef(name = "note", type = JAXBElement.class)
})
protected JAXBElement<?> addressOrPhoneNumberOrNote;

Для получения дополнительной информации

...