从多个WSDL文件生成Java文件

时间:2014-08-26 20:57:44

标签: java web-services maven xsd wsdl

我目前正参与一个项目,我们必须将我们的系统集成到外部系统。负责外部系统的公司为我们提供了多个WSDL和相应的XSD文件(超过100个WSDL文件)。每个WSDL文件都包含有关各种服务的信息,XSD文件包含有关每种服务使用的类型的信息。

我目前面临的问题是当我从这些XSD文件生成Java类时。许多XSD文件包含相同的类型。可以说几乎所有这些XSD文件都包含有关“用户”的信息。用户类型在所有XSD文件中都相同,并且具有相同的命名空间。当从这些WSDL文件生成Java类并将它们放在不同的包中时,我最终得到了同一类的超过一百个版本。如果我将所有Java类放在同一个包中,我会覆盖ObjectFactory。

因此,当我从一个WSDL文件生成Java类时,结果将在大约一百个Java类中。所有其他WSDL文件中有50个这些类是相同的,其余的仅对于该WSDL文件是唯一的。

我的问题如下:处理这类情景的最佳做法是什么?是否可以将所有这些WSDL文件合并到一个文件中,然后从中生成类?或者当我生成Java类时,是否可以将所有公共类提取到一个单独的包中?

目前我们使用Apache CXF和Maven(cxf-codegen-plugin)生成我们的类,然后做一些手动工作。但是,我认为应该有一种更有效的方法来解决这个问题。

我感谢所有帮助我解决问题。

2 个答案:

答案 0 :(得分:1)

在jaxws-maven-plugin中,您可以一次指定多个wsdls:

                    <configuration>
                        <keep>true</keep>
                        <extension>true</extension>
                        <catalog>XXX-models/catalog.xml</catalog>
                        <packageName>com.yyy.client</packageName>
                        <wsdlUrls>
                            <wsdlUrl>${basedir}/xml-resources/web-service-references/JobSession/wsdl/JobSessionService.wsdl</wsdlUrl>
                            <wsdlUrl>${basedir}/xml-resources/web-service-references/ZZZWSService/wsdl/ZZZWSService.wsdl</wsdlUrl>
....

看看the documentation,看起来你也可以用CXF做到这一点。请参阅wsdlOptions元素。

如果这没有帮助,您应该发布pom.xml的相关部分。

答案 1 :(得分:0)

这就是我设法解决问题的方式。

<plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.basedir}/src/main/java</sourceRoot>

                        <wsdlOptions>
                            <!-- for debtProjections.wsdl -->

                            <wsdlOption>
                                <autoNameResolution>true</autoNameResolution>
                                <wsdl>${project.basedir}/src/main/resources/wsdl/debtProjections.wsdl</wsdl>
                                <wsdlLocation>classpath:/wsdl/debtProjections.wsdl</wsdlLocation>
                                <extraargs>
                                    <extraarg>-verbose</extraarg>
                                    <extraarg>-p</extraarg>
                                    <extraarg>com.mof.ws.debtprojections.service</extraarg>
                                </extraargs>

                            </wsdlOption>
                            <!-- for reference.wsdl -->
                            <wsdlOption>
                                <autoNameResolution>false</autoNameResolution>
                                <wsdl>${project.basedir}/src/main/resources/wsdl/reference.wsdl</wsdl>
                                <wsdlLocation>classpath:/wsdl/reference.wsdl</wsdlLocation>
                                <extraargs>
                                    <extraarg>-verbose</extraarg>
                                    <extraarg>-p</extraarg>
                                    <extraarg>com.mof.ws.reference.service</extraarg>
                                </extraargs>

                            </wsdlOption>
                            <!-- for dsbProjections.wsdl -->
                            <wsdlOption>
                                <autoNameResolution>false</autoNameResolution>
                                <wsdl>${project.basedir}/src/main/resources/wsdl/dsbProjections.wsdl</wsdl>
                                <wsdlLocation>classpath:/wsdl/dsbProjections.wsdl</wsdlLocation>
                                <extraargs>
                                    <extraarg>-verbose</extraarg>
                                    <extraarg>-p</extraarg>
                                    <extraarg>com.mof.ws.dbsprojections.service</extraarg>
                                </extraargs>

                            </wsdlOption>

                            <!-- for debtService?wsdl -->
                            <wsdlOption>
                                <autoNameResolution>false</autoNameResolution>
                                <wsdl>${project.basedir}/src/main/resources/wsdl/debtService.wsdl</wsdl>
                                <wsdlLocation>classpath:/wsdl/debtService.wsdl</wsdlLocation>
                                <extraargs>
                                    <extraarg>-verbose</extraarg>
                                    <extraarg>-p</extraarg>
                                    <extraarg>com.mof.ws.debtservice.service</extraarg>
                                </extraargs>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>