четверг, 11 апреля 2013 г.

wsdl2java: Two declarations cause a collision in the ObjectFactory class.

1. Получил странную ошибку при генерации: Two declarations cause a collision in the ObjectFactory class.
2. Непонятно где ошибка, поскольку xsd без перевода строки
3. Скачал локально, отформатировал, переписал все импорты в xsd и wsdl
4. Проблемных мест было два, в первой xsd:

первое объявление
<xs:element name="PersonAddress" nillable="true" type="tns:PersonAddress"/>

второе объявление
<xs:complexType name="Person">
        <xs:sequence>
            <xs:element minOccurs="0" name="Address" nillable="true" type="tns:PersonAddress"/>
   skip

во второй:

<xs:element name="BankFlags" nillable="true" type="tns:BankFlags"/>
<xs:complexType name="Bank">
        <xs:sequence>
            <xs:element minOccurs="0" name="Flags" nillable="true" type="tns:BankFlags"/>


skip

т.е ObjectFactory генерируется не совсем корректно для подобных случаев.

5. Решение нашлось тут: http://stackoverflow.com/questions/13422253/xjc-two-declarations-cause-a-collision-in-the-objectfactory-class

6. Создал фалы биндингов для этих случаев:
jaxb-binding-xsd4.xml

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="1.0">
    <jaxb:bindings schemaLocation="xsd4.xsd">
        <jaxb:bindings node="//xs:element[@name='PersonAddress']">
            <jaxb:factoryMethod name="TypePersonAddress"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

и
jaxb-binding-xsd9.xml

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="1.0">
    <jaxb:bindings schemaLocation="xsd9.xsd">
        <jaxb:bindings node="//xs:element[@name='BankFlags']">
            <jaxb:factoryMethod name="TypeBankFlags"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

7. Прописываем параметры в pom.xml

<plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>2.7.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                        <configuration>
                            <sourceRoot>${basedir}/target/generated-sources</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <extraargs>
                                        <extraarg>-verbose</extraarg>                                        <extraarg>-b</extraarg>
                                        <extraarg>${basedir}/src/main/resources/jaxb-binding-xsd4.xml</extraarg>
                                        <extraarg>-b</extraarg>
                                        <extraarg>${basedir}/src/main/resources/jaxb-binding-xsd9.xml</extraarg>
                                    </extraargs>
                                    <wsdl>
                                        ${basedir}/src/main/resources/service.wsdl
                                    </wsdl>
                                    <wsdlLocation>classpath:service.wsdl</wsdlLocation>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
8. Классы сгенерировались, ура!

Комментариев нет:

Отправить комментарий