0

次のプロジェクト構造があります。

サービス親

|__サービススキーマ

|__サービスデータベース

|__サービス契約

|__サービス実装

最終的に、Web サービスを介して渡されるオブジェクトが最終的にデータベースに格納される必要があるため (変換は必要ありません)、hyperjaxb3 を使用しています。

モジュールservice-schemasで、Web サービスで使用する XSD スキーマを定義しました。service-databaseは、hyperjaxb3 を使用して JPA-JAXB オブジェクトを生成します。service-contractは、cxf-codegen-plugin Maven プラグインを使用して Java サービス インターフェイスを生成します。service-implementationが最終的な Web サービスの実装になります。考え方はOKだと思います。ただし、 baseCustomClassを拡張するには JPA クラス (hyperjaxb3 を使用して生成したもの) が必要なため、hyperjaxb3 と cxf-codegen-plugin を使用すると問題が発生します。問題は、たとえば Web サービス メソッドpersitCustom(CustomType)に対してテストを作成すると、XML がCustomTypeに逆シリアル化されることです。cxf-codegen-plugin (サービス インターフェイスの生成に使用したツール) によって生成されます。現在、そのクラスは、hyperjaxb3 によって生成された CustomType と正確には一致しません(コンパイル時には問題はありませんが、両方のクラスが「ほぼ」同じ、同じプロパティ、同じパッケージなどであるためです...) 問題は、どのように行うかですサービスの実装に、cxf-codegen-pluginで生成されたクラスではなく、hyperjaxb3 で生成されたクラスを使用するように強制しています。

これらは私が使用しているバージョンです

<plugin>
        <groupId>org.jvnet.hyperjaxb3</groupId>
        <artifactId>maven-hyperjaxb3-plugin</artifactId>
        <version>0.6.0</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <extension>true</extension>
            <args>
                <arg>-Xinheritance</arg>
            </args>
        </configuration>
    </plugin>

これは cxf-codegen-plugin 用です

<plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>2.7.9</version>
            <executions>
                <execution>
                    <id>process-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>
                                    ${project.build.directory}/src/main/resources/SharedModel/sampleWeb/service.wsdl
                                </wsdl>
                                <wsdlLocation>classpath*:sampleWeb/service.wsdl</wsdlLocation>
                                <bindingFiles/>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
4

1 に答える 1

0

わかりました、cxf-codegen-plugin に競合する型を含む名前空間内のクラスを除外するように指示する方法を見つけました。この行をプラグインの構成セクションに追加しました。それらはhttp://conflicting/types/namespace/名前空間の下にあります

<extraargs>
    <extraarg>-nexclude</extraarg>
    <extraarg>http://conflicting/types/namespace/</extraarg>
</extraargs>
于 2015-12-21T21:16:41.233 に答える