JAXB – 属性“值”已被定义。 使用<jaxb:property>来解决这个冲突

使用JAXB生成XML绑定类。

该模式基于一组传统的XML文件,并包含以下代码片段:

<xs:complexType name="MetaType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="Name" /> <xs:attribute type="xs:string" name="Scheme" /> <xs:attribute type="xs:string" name="Value" /> </xs:extension> </xs:simpleContent> </xs:complexType> 

“值”属性与xs:string的“值”属性冲突,并且代码生成失败,出现错误:

 com.sun.istack.SAXParseException2: Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict. 

答案在于使用JAXB绑定( site-template.xjb ):

 <bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <bindings schemaLocation="site-template.xsd" version="1.0"> <!-- Customise the package name --> <schemaBindings> <package name="com.example.schema"/> </schemaBindings> <!-- rename the value element --> <bindings node="//xs:complexType[@name='MetaType']"> <bindings node=".//xs:attribute[@name='Value']"> <property name="ValueAttribute"/> </bindings> </bindings> </bindings> </bindings> 

XPathexpression式定位节点并对其进行重命名,从而避免了命名冲突。

使用这个绑定XML文件,生成的Java类最终具有所需的getValueAttribute() (以及getValue() )。

如果您想避免创build/更改JAXB绑定文件,并且不介意标注XSD,则可以将jxb:property标注添加到属性的定义中,例如:

 <xs:complexType name="MetaType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="Name" /> <xs:attribute type="xs:string" name="Scheme" /> <xs:attribute type="xs:string" name="Value"> <!-- rename property generated by JAXB (avoiding "Value" name conflict) --> <xs:annotation> <xs:appinfo> <jxb:property name="valueAttribute"/> </xs:appinfo> </xs:annotation> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> 

适当添加到xs:schema标签:

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.1"> 

在创buildxxxx.xjb文件之后,如下所示,为重复的属性名称“值”(重复为JAXB提供的默认“值”)创build一个xxxx.xjb文件,运行XJC命令创buildJAXB对象

xjc -p“com.track.doc”-d“C:\ JAXBDocuments \ prasam \ Desktop \ JAXB_me \ DealerTrace”appSamp.xsd -b xxxx.xjb

appSmp.xsd : –

 <xsd:complexType name="range"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="value" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> 

xxxx.xjb : –

 <?xml version="1.0" encoding="UTF-8"?> <bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <bindings schemaLocation="appSmp.xsd" version="1.0"> <schemaBindings> <package name="com.track.doc"/> </schemaBindings> <bindings node="//xs:complexType[@name='range']"> <bindings node=".//xs:attribute[@name='value']"> <property name="valueAttribute"/> </bindings> </bindings> </bindings> </bindings> 

我在使用Eclipse的解决scheme(尝试Helios SR1和Juno SR1)和CXF 2.6.3时遇到了问题。 解决scheme与Kaitsu所说的相似。 即Eclipse的New> Web Service向导将wsdl复制到foldre WebContent / wsdl中。 我必须把wsdl和绑定文件放在那里。 否则,绑定文件给出了“不是这个编译的一部分”的错误。

我无法在WSDL中使用内联模式,但它在外部模式(如答案#1)中起作用。

我正在使用CXF Servlet端点configuration选项。 在我的WSDL中,我有:

 <wsdl:port binding="axis2:ConverterSOAP12Binding" name="ConverterSOAP12port_http"> <soap12:address location="http://localhost/Converter/services/Converter"/> </wsdl:port> 

向导生成这个到我的web.xml,这工作正常:

 <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> 

但是把它放到cxf-servlet.xml中:

 <jaxws:endpoint xmlns:tns="http://wtp" id="converterporttype" implementor="wtp.ConverterPortTypeImpl" wsdlLocation="wsdl/Converter.wsdl" endpointName="tns:ConverterSOAP12port_http" serviceName="tns:Converter" address="/ConverterSOAP12port_http"> <jaxws:features> <bean class="org.apache.cxf.feature.LoggingFeature" /> </jaxws:features> </jaxws:endpoint> 

我不得不将地址更改为完整的URL,如下所示:

 address="http://localhost:8080/Converter/services/Converter"> 

在其他答案中提到的绑定文件在CXF 3.0.0中不适用于我。 请注意,jaxb命名空间有一个元素“绑定”,所以名称空间jaxws也是如此,所以我们需要声明它们:

 <?xml version="1.0" encoding="UTF-8"?> <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" wsdlLocation="mesh.wsdl" > <bindings node="wsdl:definitions/wsdl:types/xs:schema[..."> <jaxb:bindings node="./xs:element[@name='Profiles']"> <jaxb:property name="ProfilesElement"/> </jaxb:bindings> </bindings> </bindings> 

在我的情况下,模式已经在WSDL中了,所以我没有必要指定schemaLocation属性。