webentwicklung-frage-antwort-db.com.de

JAXB - Eigenschaft "Value" ist bereits definiert. Verwenden Sie <jaxb: property>, um diesen Konflikt zu lösen

Verwendung von JAXB zum Generieren von XML-Bindungsklassen.

Das Schema basiert auf einer Reihe von alten XML-Dateien und enthält dieses 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>

Das 'Value'-Attribut steht in Konflikt mit der' value'-Eigenschaft von xs:string, und die Codegenerierung schlägt mit dem Fehler fehl:

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

Die Antwort liegt in der Verwendung von JAXB-Bindungen (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>

Die XPath-Ausdrücke lokalisieren die Knoten und benennen sie um, wodurch der Namenskonflikt vermieden wird.

Bei Verwendung dieser Bindungs-XML-Datei erhält die generierte Java-Klasse die gewünschte getValueAttribute() (sowie die getValue()).

62
brasskazoo

Wenn Sie das Erstellen/Ändern einer JAXB-Bindungsdatei vermeiden möchten und Ihre XSD nicht kommentieren möchten, können Sie die Annotation jxb: property der Attributdefinition hinzufügen, z.

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

mit geeigneten Ergänzungen zum 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">
16
Gary

Sobald die xxxx.xjb-Datei für den doppelten Attributnamen "value" erstellt wurde (Duplikat ist der von JAXB bereitgestellte Standardwert "value"), führen Sie den Befehl XJC aus, um JAXB-Objekte zu erstellen

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

Ich hatte ein Problem bei der Verwendung der Lösung mit Eclipse (sowohl Helios SR1 als auch Juno SR1 versucht) und CXF 2.6.3. Die Lösung ähnelte der von Kaitsu. Der Assistent für neue> Web Services von Eclipse kopiert die WSDL-Datei in den Foldre-WebContent/WSDL. Ich musste das Wsdl und die Bindungsdatei selbst dort ablegen. Andernfalls hat die Bindungsdatei den Fehler "ist nicht Teil dieser Kompilierung" gegeben.

Ich konnte kein Inline-Schema in der WSDL verwenden, funktionierte jedoch mit einem externen Schema wie in Antwort Nr. 1.

Ich verwende die CXF-Servlet-Endpunkt-Konfigurationsoption. In meiner WSDL habe ich:

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

Der Assistent hat dies in meiner web.xml generiert, was in Ordnung ist:

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

Aber es hat dies in cxf-servlet.xml geschrieben:

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

Ich musste die Adresse wie folgt in die vollständige URL ändern:

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

Keine dieser Bindungen funktionierte für mich, ich habe diesen Fehler erhalten:

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

Es entstand ein leerer Zielknoten ... Dann bemerkte ich (nach 30 Minuten Dispair), dass meine Bindung auf einen complexType statt auf ein Element zielte. Die Antwort war in meiner Xsd-Datei.

Vielen Dank

1

Diese in der anderen Antwort erwähnte Bindungsdatei funktionierte für mich nicht mit CXF 3.0.0 . Beachten Sie, dass der jaxb-Namespace ein Element "bindings" hat. Dies gilt auch für den Namespace "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>

In meinem Fall befand sich das Schema bereits in der WSDL, sodass ich das Attribut schemaLocation nicht angeben musste.

sie können auch den Parameter -XautoNameResolution in der Befehlszeile und auch im Plug-in verwenden, damit jxc den Namen auflösen kann, wenn Sie sich nicht um den Namen in den Klassen kümmern.

0