Подтвердить что ты не робот

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

У меня возникла проблема с использованием решения с 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">

Ответ 5

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