JAXB - Свойство «Значение» уже определено. Используйте <jaxb: property> для разрешения этого конфликта - PullRequest
58 голосов
/ 09 декабря 2010

Использование 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. 

Ответы [ 7 ]

62 голосов
/ 09 декабря 2010

Ответ заключается в использовании привязок 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>

Выражения XPath находят узлы и переименовывают их, тем самым избегая конфликта имен.

Используя этот XML-файл привязок, сгенерированный Java-класс в итоге получит желаемый getValueAttribute() (а также getValue()).

19 голосов
/ 21 июля 2016

Если вы хотите избежать создания / изменения файла привязок 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:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
           jxb:version="2.1">
7 голосов
/ 03 февраля 2015

После того как файл xxxx.xjb создан для дублированного имени атрибута «значение» (дубликат является значением «по умолчанию», предоставляемым JAXB), как показано ниже, выполните команду XJC для создания объектов JAXB

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>
1 голос
/ 02 августа 2018

Ни одна из этих привязок не сработала для меня, я получил эту ошибку:

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

Он выдал пустой целевой узел ... Затем я понял (после 30 минут отчаяния), что моя привязка была направленаcomplexType вместо элемента.Ответ был в моем файле xsd.

Спасибо

1 голос
/ 31 октября 2012

У меня была проблема с использованием решения с Eclipse (пробовал и Helios SR1 и Juno SR1) и CXF 2.6.3. Решение было похоже на то, что говорит Kaitsu. А именно, мастер New> Web Service в Eclipse копирует wsdl в сложенный WebContent / wsdl. Я должен был поместить туда wsdl и файл привязки. В противном случае файл привязки выдал ошибку «не является частью этой компиляции».

Мне не удалось использовать встроенную схему в WSDL, но она работала с внешней схемой, как в ответе № 1.

Я использую опцию конфигурации конечной точки сервлета CXF. В моем 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">
0 голосов
/ 14 июня 2018

вы также можете использовать параметр -XautoNameResolution в командной строке, а также в плагине, чтобы позволить jxc разрешить имя, если вы не беспокоитесь об имени в классах.

0 голосов
/ 04 июля 2014

Этот файл привязок, упомянутый в другом ответе, не работал для меня с 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.

...