从多个WSDL文件中生成Java文件

3
我目前参与一个项目,需要将我们的系统集成到外部系统中。负责外部系统的公司提供了多个WSDL和相应的XSD文件(超过100个WSDL文件)。每个WSDL文件都包含有关各种服务的信息,而XSD文件则包含用于每个服务的类型信息。
我当前面临的问题是:当我从这些XSD文件生成Java类时,许多XSD文件包含相同的类型。假设几乎所有这些XSD文件都包含有关“用户”的信息。用户类型在所有XSD文件中均相同,并具有相同的命名空间。当从这些WSDL文件生成Java类并将它们放置在不同的包中时,我最终会得到超过一百个版本的相同类。如果我将所有Java类放在同一个包中,则会覆盖ObjectFactory。
因此,当我从一个WSDL文件生成Java类时,结果将为大约一百个Java类。其中五十个类在其他所有WSDL文件中都是相同的,其余的则只是该WSDL文件中独特的。
我的问题是:如何处理这些情况的最佳实践是什么?是否可以将所有这些WSDL文件合并为一个文件,然后从中生成类?或者,在生成Java类时,是否可以将所有公共类提取到单独的包中?
目前,我们使用Apache CXF和Maven(cxf-codegen-plugin)生成我们的类,然后进行一些手动操作。但是,我相信应该有更有效的方法来处理这个问题。
非常感谢您提供的所有帮助。

你尝试过将这些Java类生成到同一个包中吗?也许重复的部分会互相覆盖? - undefined
1
是的,我已经尝试过了。然而,问题在于我的解决方案覆盖了每个WSDL文件生成的ObjectFactory。每个ObjectFactory对于每个WSDL文件来说都是更或多或少独特的。 - undefined
啊..没有考虑到那种情况。我不确定是否可以在不进一步调整将这些定义转换为POJO的实际源代码的情况下避免这个问题。我猜你可以将其复制到公共包中作为基础,然后单独运行wsimport来获取所有ObjectFactory定义以满足你的需求。虽然是繁琐的工作,但仍然是可行的解决方法。或者,也许你可以找到一个能够正确合并多个wsdl文件的工具...也许那会是一个更好的解决方案? - undefined
2个回答

1
在jaxws-maven-plugin中,您可以同时指定多个wsdl:
                    <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>
....

看起来你也可以用CXF来实现这个,具体请查看文档the documentation中的wsdlOptions元素。
如果这不够帮助,请把你pom.xml中相关部分发出来。

1
非常感谢您的回答。我尝试了您提供的解决方案,然而这并没有解决我的问题。它为每个WSDL文件生成了类,但也覆盖了ObjectFactory类。我需要一个解决方案,其中ObjectFactory要么合并,要么每个ObjectFactory更改名称。 - undefined
你确定它没有合并吗?考虑在CXF邮件列表上询问一下。 - undefined
是的,我确定它没有合并。谢谢你的建议。我会这样做的。 - undefined
1
你解决了ObjectFactory类在每次迭代wsdl文件时未合并或被覆盖的问题吗? - undefined

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接