【问题标题】:Generating Java files from multiple WSDL files从多个 WSDL 文件生成 Java 文件
【发布时间】:2014-08-26 20:57:44
【问题描述】:

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

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

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

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

目前我们使用 Apache CXF 和 Maven (cxf-codegen-plugin) 来生成我们的类,然后做一些手动工作。不过,我相信应该有更有效的方法来处理这个问题。

感谢我在这个问题上获得的所有帮助。

【问题讨论】:

  • 您是否尝试过将这些 java 类生成到同一个包中?也许重复项会相互覆盖?
  • 是的,我已经尝试过了。但是,问题是我的解决方案覆盖了从每个 WSDL 文件生成的 ObjectFactory。对于每个 WSDL 文件,每个 ObjectFactory 或多或少都是唯一的。
  • 啊.. 没想到那种情况。如果不进一步调整将这些定义转换为 POJO 的实际源,我不确定是否可以避免这种情况。我想您可以复制到 common 包作为您的基础,然后单独运行 wsimport 以获取所有 ObjectFactory 定义以供您使用。繁琐的工作,但仍然是一个可行的解决方法。或者,如果您能找到一个可以正确合并多个 wsdl 的工具……也许这是一个更好的解决方案?

标签: java web-services maven xsd wsdl


【解决方案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 的相关部分。

【讨论】:

  • 非常感谢您的回答。我尝试了您的解决方案,但是,这并没有解决我的问题。它为每个 WSDL 文件生成类。但它也覆盖了 ObjectFactory 类。我需要一个解决方案,其中 ObjectFactory 被合并或每个 ObjectFactory 更改名称。
  • 确定没有合并?考虑在 CXF 邮件列表中询问。
  • 是的,我确定它没有被合并。感谢您的建议。我会这样做的。
  • 您是否找到了解决 ObjectFactory 类未合并或在每次迭代 wsdl 文件时被覆盖的问题的解决方案?
【解决方案2】:

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

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2011-10-18
    • 2010-10-29
    • 2012-12-12
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多