WebService客户端和列表<jaxbelement <?>&gt; </jaxbelement <?>

时间:2011-08-26 14:42:00

标签: jaxb cxf webservice-client

当我尝试从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> 

据我所知,这与wsdl文档中的 choice 标记有关。

提前致谢

1 个答案:

答案 0 :(得分:6)

将为选择属性生成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> 

将生成Object属性的XML架构

在此版本的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;

将生成JAXBElement属性的XML架构

现在我们将修改选择结构,以便noteemail方法都对应String类。

<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>

由于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;

了解更多信息