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

JavaXsdJaxb

Java Problem Overview


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. 

Java Solutions


Solution 1 - Java

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()).

Solution 2 - Java

If you want to avoid creating/changing a JAXB bindings file, and you don't mind annotating your XSD, you can add the jxb:property annotation to your attribute's definition, e.g.:

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

with suitable additions to the xs:schema tag:

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

Solution 3 - Java

Once after xxxx.xjb file is created for duplicate attribute name "value" (duplicate is default 'value' provided by JAXB) as below, run XJC command to create JAXB objects

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>

Solution 4 - Java

I had a problem using the solution with Eclipse (tried both Helios SR1 and Juno SR1) and CXF 2.6.3. The solution was similar to what Kaitsu says. Namely the New > Web Service wizard of Eclipse copies the wsdl into the foldre WebContent/wsdl. I had to place the wsdl and the binding file there myself. Otherwise the binding file gave the "is not a part of this compilation" error.

I wasn't able to use an inline schema in the WSDL but it did work with an external schema like in answer #1.

I'm using the CXF Servlet endpoint config option. In my WSDL I have:

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

The wizard generated this into my web.xml, which works ok:

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

But it put this into 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>

I had to change the address into the full URL, like this:

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

Solution 5 - Java

None of this bindings worked for me, i got this error:

[ERROR] La evaluación de XPath de ".//xs:attribute[@name='Value']" produce un nodo de destino vacío

It produced an empty target node... Then i realized (after 30 minutes of dispair) that my binding was aiming to a complexType instead of an element. The answer was in my xsd file.

Thank you

Solution 6 - Java

This bindings file mentioned in the other answer did not work for me with CXF 3.0.0. Notice that jaxb namespace has an element "bindings" and so do the namespace jaxws, so we need to declare them:

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

In my case the schema was already inside the WSDL so I did no have to specify the schemaLocation attribute.

Solution 7 - Java

you can also use the parameter -XautoNameResolution in the command line and also in the pluggin to let jxc resolve the name if you don´t bother about the name on the classes.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbrasskazooView Question on Stackoverflow
Solution 1 - JavabrasskazooView Answer on Stackoverflow
Solution 2 - JavaGaryView Answer on Stackoverflow
Solution 3 - JavarrayasamView Answer on Stackoverflow
Solution 4 - Javauser1787681View Answer on Stackoverflow
Solution 5 - JavaRicardo ÁlvarezView Answer on Stackoverflow
Solution 6 - JavaConstantino CronembergerView Answer on Stackoverflow
Solution 7 - JavaHernan RamovecchiView Answer on Stackoverflow