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




xsd (7)

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

Answers

После создания файла 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>

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

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

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

спасибо


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


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


У меня возникла проблема с использованием решения с Eclipse (как для Helios SR1, так и для Juno SR1) и CXF 2.6.3. Решение было похоже на то, что говорит Кайтсу. А именно, мастер New> Web Service из Eclipse копирует wsdl в файл folder 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">

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

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

Существует инструмент командной строки под названием XSD2DB , который генерирует базу данных из xsd-файлов, доступных в sourceforge.







java xsd jaxb