JAXB – Property “Value” ist bereits definiert. Verwenden um diesen Konflikt zu lösen

Lesezeit: 7 Minuten

Verwenden von JAXB zum Generieren von XML-Bindungsklassen.

Das Schema basiert auf einer Reihe von Legacy-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:stringund 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. 

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.

Unter Verwendung dieser XML-Bindungsdatei hat die generierte Java-Klasse schließlich die gewünschte getValueAttribute() (ebenso wie getValue()).

  • Ich hatte dieses Problem auch und diese Antwort hat es gelöst, danke! Ich möchte hinzufügen, dass Sie, wenn Sie die Java-Klassengenerierung mit dem Maven-Jaxb-Plugin durchführen, die xjb-Datei in dasselbe Ressourcenverzeichnis wie die eigentliche XSD-Datei legen können.

    – Kaisu

    5. Januar 2012 um 14:27 Uhr


  • Kann diese Lösung irgendwie für Remote-XSDs verwendet werden? Ich erhalte “ist nicht Teil dieser Zusammenstellung”. Error. Vielen Dank.

    – tomasb

    17. Juli 2012 um 12:20 Uhr

  • Wo soll ich das hinstellen site-template.xjb Datei?

    – Andremonie

    27. Mai 2015 um 7:14 Uhr

  • @Andremoniy legen Sie die Datei an einer beliebigen Stelle ab und geben Sie sie dann als Befehlszeilenargument an. Siehe die -b Argument in der Antwort von @rayasam

    – Hundehaare

    30. Januar 2018 um 22:15 Uhr

  • Was hier helfen würde, wäre eine Erklärung der Bindung der .xjb-Datei an die .xsd

    – derRiley

    10. März 2021 um 16:24 Uhr

Wenn Sie das Erstellen/Ändern einer JAXB-Bindungsdatei vermeiden möchten und es Ihnen nichts ausmacht, Ihre XSD zu kommentieren, können Sie die jxb:Eigenschaft Anmerkung zur Definition Ihres Attributs, z. B.:

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

  • Das war viel besser für mich. Die akzeptierte Antwort erforderte eine Einrichtung, die ich nicht verwalten konnte. Ich wollte nur, dass es funktioniert!

    – Schmiede

    10. Mai 2017 um 13:18 Uhr

  • Ich denke, diese Antwort wäre besser geeignet, um eine richtige Frage zu beantworten

    – Idealmax

    28. Juni 2017 um 9:45 Uhr

  • Hi. Ich versuche, meine .wsdl-Datei damit zu reparieren, aber die wsdl-Definitionen besagen, dass sie jxb:version im Element nicht zulassen. Wie könnte ich dort den jxb-Namespace und die Version einfügen?

    – Ognjen Mišić

    3. Februar 2019 um 22:34 Uhr

  • Ein direkterer Ansatz. Hat bei mir auch funktioniert!

    – Nicken

    11. Juli 2019 um 19:48 Uhr

  • Danke, es hat geholfen, -p xxx.xjb ist eine größere Herausforderung.

    – Granit

    3. September 2020 um 17:22 Uhr

Benutzer-Avatar
rayasam

Sobald die xxxx.xjb-Datei für den doppelten Attributnamen „Wert“ erstellt wurde (das Duplikat ist der von JAXB bereitgestellte Standardwert), führen Sie den XJC-Befehl 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>

  • Hallo, Danke für die Antwort. Eigentlich stehe ich vor dem Problem, also habe ich diese Antwort gefunden und versucht, die hier angegebenen Schritte zu befolgen: Ich habe die appSmp.xsd und ‚xxxx.xjb‘-Dateien in einem Verzeichnis zusammen mit dem in dieser Antwort bereitgestellten Inhalt. Dateipfad geändert und folgenden Befehl ausgeführt: xjc -p "com.track.doc" -d "path" appSamp.xsd -b xxxx.xjb trotzdem bekomme ich den Fehler: ` [ERROR] schema_reference.4: Fehler beim Lesen des Schemadokuments „Pfad/appSamp.xsd“, weil 1) das Dokument nicht gefunden werden konnte; 2) das Dokument konnte nicht gelesen werden; 3) das Root-Element des Dokuments ist nicht . unbekannter Ort”.

    – BATMAN_2008

    19. April 2021 um 14:39 Uhr

Ich hatte ein Problem bei der Verwendung der Lösung mit Eclipse (habe sowohl Helios SR1 als auch Juno SR1 ausprobiert) und CXF 2.6.3. Die Lösung ähnelte der von Kaitsu. Der New > Web Service Wizard von Eclipse kopiert nämlich die wsdl in den Ordner WebContent/wsdl. Ich musste die wsdl und die Bindungsdatei selbst dort ablegen. Andernfalls gab die Bindungsdatei den Fehler „ist kein Teil dieser Kompilierung“ aus.

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

Ich verwende die CXF-Servlet-Endpunktkonfigurationsoption. 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 meine web.xml generiert, was gut funktioniert:

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

Aber es hat dies in cxf-servlet.xml eingefügt:

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

Keine dieser Bindungen hat bei mir funktioniert, ich habe diesen Fehler bekommen:

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

Es erzeugte einen leeren Zielknoten … Dann erkannte ich (nach 30 Minuten der Verzweiflung), dass meine Bindung auf einen komplexen Typ statt auf ein Element abzielte. Die Antwort war in meiner xsd-Datei.

Vielen Dank

Benutzer-Avatar
Constantino Cronemberger

Diese in der anderen Antwort erwähnte Bindungsdatei funktionierte bei mir mit CXF 3.0.0 nicht. Beachten Sie, dass der jaxb-Namespace ein Element „Bindungen“ hat, ebenso wie der Namespace jaxws, also müssen wir sie deklarieren:

<?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 schemaLocation-Attribut nicht angeben musste.

Benutzer-Avatar
Hernan Ramovecchi

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

1158370cookie-checkJAXB – Property “Value” ist bereits definiert. Verwenden um diesen Konflikt zu lösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy