JAXB-свойство "Value" уже определено. Используйте для разрешения этого конфликта
использование 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>
атрибут 'Value' конфликтует со свойством 'value'xs:string, и генерация кода завершается с ошибкой:
com.sun.istack.SAXParseException2: Property "Value" is already defined. Use <jaxb:property> to resolve this conflict.
7 ответов:
ответ заключается в использовании Привязок 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()).
Если вы хотите избежать создания / изменения файла Привязок JAXB, и вы не возражаете аннотировать свой XSD, вы можете добавить jxb: свойство аннотация к определению атрибута, например:
<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">
один раз после ХХХХ.файл xjb создается для повторяющегося имени атрибута "value" (дубликат-это значение по умолчанию, предоставляемое JAXB) как показано ниже, выполните команду XJC для создания объектов JAXB
XJC-p "com.дорожка.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>
у меня была проблема с использованием решения с Eclipse (пробовал как Helios SR1, так и Juno SR1) и CXF 2.6.3. Решение было похоже на то, что говорит Кайцу. А именно мастер создания > веб-службы 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>мастер создал это в моей сети.XML, который работает нормально:
<servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>но это в CXF-сервлет.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">
ни одна из этих Привязок не работала для меня, я получил эту ошибку:
[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.
вы также можете использовать параметр-XautoNameResolution в командной строке, а также в pluggin, чтобы разрешить jxc имя, если вы не беспокоитесь об имени в классах.
Comments