2011-08-26 100 views
3

当我尝试从WSDL文档生成客户端,我得到一个客户端,似乎有很多的JAXBElement atributes的,例如WebService的客户端和List <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文档中选择标签有关。

由于事先

回答

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> 

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> 

既然选择属性的值是足以唯一地识别元件,该属性不包含的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物业

现在我们将修改选择结构,以便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> 

既然选择属性的值是不再足以唯一标识元素,属性必须包含的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; 

更多信息

+0

感谢您的回答,所以您告诉我**总是**如果我有对应于相同Java类的元素,我会得到一个JAXBElement ? – Nicolas

+0

@Nicolas - 这是真实的,并确保您的XML文档可以被循环移除。如果没有JAXB元素,你会如何区分元帅应该使用哪个元素(例如,在我的例子中,是否将字符串的实例包装在“email”或“note”中?) –

+0

好吧,我明白了,谢谢你的快速响应。 – Nicolas

相关问题