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 <jaxb:property> to resolve this conflict.
Ответы
Ответ 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.