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



2 Answers

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

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



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



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






Related



Tags

java java   xsd   jaxb