Как разрешить коллизию в ObjectFactory на wsdl2java?

Я использую CXF и wsdl2java для автогенерации классов webservice.

проблема: каким-то образом веб-сервис, к которому я хочу подключиться, имеет повторяющиеся имена для некоторых элементов:

Two declarations cause a collision in the ObjectFactory class

xsd как:

<xs:schema targetNamespace="http://thenamespace">
    <xs:complexType name="ViolatingName">
     ...
    </xs:complexType>
    <xs:element name="ViolatingName" nillable="true" type="tns:ViolatingName"/>
</xs:schema>

сам xsd импортируется внутри wsdl, который используется для автогенерации классов jaxb следующим образом:

<wsdl:types>
    <xsd:schema targetNamespace="http://imports">
        <xsd:import schemaLocation="https://path.to.xsd" namespace="http://thenamespace" />

Я пытаюсь покрыть это, используя jaxb-bindings.xml:

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

    <jaxb:bindings schemalocation="https://path.to.xsd" node="//xs:schema">
    <jaxb:bindings node=".//xs:element[@name='ViolatingName']">
            <jaxb:property name="ViolatingNameBinding" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

результат:

[ERROR] XPath evaluation of "//xs:schema" results in empty target node (org.apache.cxf:cxf-codegen-plugin:3.0.1:wsdl2java:generate-sources:generate-sources)

почему node здесь плохого? Xsd-файле есть xs:schema tag, так почему это не удается?

интересный факт: когда я использую любой инструмент xpath, загрузите XSD на мою локальную машину, проверьте путь, затем //xs:schema/xs:element[@name='ViolatingName'] вычисляет правильный тег.

3 ответов


оказалось, что я должен применить переименование / суффикс на всех xs:complexType такие элементы:

<jaxb:bindings schemaLocation="https://path.to.xsd" node="/xs:schema">
    <jaxb:schemaBindings>
        <jaxb:nameXmlTransform>
            <jaxb:typeName suffix="Type" />
        </jaxb:nameXmlTransform>
    </jaxb:schemaBindings>
</jaxb:bindings>

попробовать jaxb:factoryMethod вместо jaxb:property.

<jaxb:bindings node=".//xs:element[@name='ViolatingName']">
    <jaxb:factoryMethod name="ViolatingName1" />
</jaxb:bindings>

An пример привязки используя jaxb:factoryMethod.

обновление:

этой может помочь.


Объявления Привязки Свойств

объявление привязки позволяет настроить привязку элемента схемы XML к его представлению Java в качестве свойства. Область настройки может быть либо на уровне определения, либо на уровне компонента в зависимости от того, где указано объявление привязки.

синтаксис для настроек:

<property      [ name = "propertyName"]
  [ collectionType = "propertyCollectionType" ]
  [ fixedAttributeAsConstantProperty = "true" | "false" | "1" | "0" ]
  [ generateIsSetMethod = "true" | "false" | "1" | "0" ]
  [ enableFailFastCheck ="true" | "false" | "1" | "0" ]
  [ <baseType> ... </baseType> ]
  [ <javadoc> ... </javadoc> ]
</property>

<baseType>
  <javaType> ... </javaType>
</baseType> 
  • name определяет значение настройки propertyName; это должна быть законная Java идентификатор.
  • collectionType определяет значение настройки propertyCollectionType, которое является типом коллекции для свойства. propertyCollectionType если указано, может быть индексировано или любое полное имя класса, реализующее java.утиль.Список.
  • fixedAttributeAsConstantProperty определяет значение настройки fixedAttributeAsConstantProperty. Значение может быть true, false, 1 или 0.
  • generateIsSetMethod определяет значение настройки generateIsSetMethod. Значение может быть true, false, 1 или 0. enableFailFastCheck определяет значение настройки enableFailFastCheck. Значение может быть true, false, 1 или 0. Обратите внимание, что реализация JAXB не поддерживает проверку failfast.
  • <javadoc> настраивает аннотации инструмента Javadoc для метода getter свойства.

от этого ссылке

xsd-схемы

<xs:schema targetNamespace="http://thenamespace">
    <xs:element name="ViolatingName" type="tns:ViolatingName"/> 
    <xs:complexType name="ViolatingName">
        <xs:all>
            <xs:element name="prova" type="xs:string"/>
        </xs:all>
    </xs:complexType>

    <xs:element name="AdditionalInfos" type="AdditionalInfos"/>
    <xs:complexType name="AdditionalInfos">
        <xs:sequence>
            <xs:element minOccurs="1" name="ViolatingName" type="tns:ViolatingName"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

обязательные

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix">
    <bindings schemaLocation="../path/of/your.xsd">

            <bindings node="//xs:complexType[@name='AdditionalInfos']//xs:sequence//xs:element[@name='ViolatingName']">
                <property name="aaa" />
            </bindings>

    </bindings>
</bindings>

Созданный Класс

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AdditionalInfos", propOrder = {
    "aaa",
})
@XmlRootElement
public class AdditionalInfos
    implements Serializable
{

    private final static long serialVersionUID = 12343L;
    @XmlElement(name = "ViolatingName", required = true)
    protected ViolatingName aaa;