1

maven cxf-codegen-plugin (org.apache.cxf) を使用して Java コードを生成する 2 つの WSDL があります。どちらも同じ名前空間を使用し、同じ名前の複雑な型が含まれているため、競合する Java クラス名の問題が発生しました。bindings.xml を使用して解決することにしました。

<jaxws:bindings
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
        xmlns="http://www.w3.org/2001/XMLSchema"
        version="2.1">
    <jaxws:bindings wsdlLocation="./TaskService_v1.wsdl" node="xsd:schema">
        <jaxb:schemaBindings>
            <jaxb:nameXmlTransform>
                <jaxb:typeName prefix="TaskService" />
                <jaxb:elementName prefix="TaskService" />
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
    </jaxws:bindings>
</jaxws:bindings>

たとえば、生成されたクラス B2BParameter を TaskServiceB2BParameter に名前を変更したため、競合する名前の問題が発生しなくなりましたが、別の問題に遭遇しました。

Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://serviceinterface.b2b.adx.com}B2BParameter". Use @XmlType.name and @XmlType.namespace to assign different names to them.
this problem is related to the following location:
    at com.adx.b2b.serviceinterface.TaskServiceB2BParameter
this problem is related to the following location:
    at com.adx.b2b.serviceinterface.B2BParameter
    at protected java.util.List com.adx.b2b.serviceinterface.B2BRequest.parameter
    at com.adx.b2b.serviceinterface.B2BRequest
...

これは生成された TaskServiceB2BParameter.java です。

package com.axd.b2b.serviceinterface_v1;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B2BParameter", propOrder = {
    "name",
    "value"
})
public class TaskServiceB2BParameter {
    ...
}

bindings.xml を更新して @XmlType.name を適切に変更するにはどうすればよいですか? または、本当にターゲット パッケージを変更する必要がありますか? 前もって感謝します!

4

1 に答える 1

1

問題は、単一のマーシャラーが同じ要素名を持つクラスを見つけたことでした。この問題を次のように解決しました。

1) クラスを異なるパッケージに生成する

        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.3.3</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/resources/META-INF/wsdl/Service1.xml</wsdl>
                                <packagenames>
                                    <packagename>com.xxx.service1</packagename>
                                </packagenames>
                            </wsdlOption>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/resources/META-INF/wsdl/Service2.xml</wsdl>
                                <packagenames>
                                    <packagename>com.xxx.service2</packagename>
                                </packagenames>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

2) サービスごとに特別なマーシャラー Bean を作成する

@Configuration
public class WebServiceConfig {

@Bean
public Jaxb2Marshaller service1Marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.xxx.service1");
    return marshaller;
}

@Bean
public Jaxb2Marshaller service2Marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.xxx.service2");
    return marshaller;
}
}
于 2019-09-19T12:16:53.867 に答える