我目前正参与一个项目,我们必须将我们的系统集成到外部系统。负责外部系统的公司为我们提供了多个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)生成我们的类,然后做一些手动工作。但是,我认为应该有一种更有效的方法来解决这个问题。
我感谢所有帮助我解决问题。
答案 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>