Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB - Property "Value" is already defined. Use <jaxb:property> to resolve this conflict

Tags:

java

jaxb

xsd

Using JAXB to generate XML binding classes.

The schema is based on a set of legacy XML files, and includes this snippet:

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

The 'Value' attribute conflicts with the 'value' property of xs:string, and the code generation fails with the error:

com.sun.istack.SAXParseException2: Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.  
like image 233
brasskazoo Avatar asked Dec 09 '10 01:12

brasskazoo


1 Answers

The answer lies in making use of JAXB bindings (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> 

The XPath expressions locate the nodes and renames it, thereby avoiding the naming conflict.

Using this bindings XML file, the generated Java class ends up having the desired getValueAttribute() (as well as the getValue()).

like image 198
brasskazoo Avatar answered Sep 23 '22 10:09

brasskazoo