如何使用 CXF wsdl2java 为在线 WSDL 生成 WebService 客户端 URL link

How to generate WebService client with CXF wsdl2java for online WSDL URL link

我正在尝试使用 Apache CXF Maven 插件的 wsdl2java 目标生成一个网络服务客户端。我有一个 WSDL URL link,但是在使用 Maven 插件时,它没有生成源代码。样本 WSDL link 是 http://www.webservicex.com/globalweather.asmx?WSDL.

<properties>
        <src.generated.dir>src/main/java</src.generated.dir>
        <artifact.cxf.version>3.1.6 </artifact.cxf.version>
        <xerces.version>2.11.0</xerces.version>
        <inbound.wsdl>http://www.webservicex.com/globalweather.asmx?WSDL</inbound.wsdl>
        <inbound.wsdl.location>http://www.webservicex.com/globalweather.asmx?WSDL</inbound.wsdl.location>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${artifact.cxf.version}</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>${src.generated.dir}</sourceRoot>
                            <defaultOptions>
                                <noAddressBinding>true</noAddressBinding>
                                <faultSerialVersionUID>3105839350746982386</faultSerialVersionUID>
                            </defaultOptions>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${inbound.wsdl}</wsdl>
                                    <wsdlLocation>${inbound.wsdl.location}</wsdlLocation>
                                    <serviceName>webservicex</serviceName>
                                    <extraargs>
                                        <extraarg>-client</extraarg>
                                        <extraarg>-verbose</extraarg>
                                        <extraarg>-p</extraarg>
                                        <extraarg>http://webservicex.ent.com/arm/=com.ent.webservicex.arm</extraarg>
                                    </extraargs>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>xerces</groupId>
                        <artifactId>xercesImpl</artifactId>
                        <version>${xerces.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

该问题与对 WSDL 文件使用 HTTP link 无关。 CXF Codegen Plugin returns 的错误是:

No service was found in wsdl: webservicex

这是正常的,因为托管在 http://www.webservicex.com/globalweather.asmx?WSDL 的 WSDL 只有一个名为 GlobalWeather 的服务;它没有名为 webservicex 的服务。 WSDL corresponds to a wsdl:service element 中的服务定义,如果您查看 WSDL,您只会看到

<wsdl:service name="GlobalWeather">
  <!-- ... -->
</wsdl:service>

因此,您应该将 CXF 配置更改为

<serviceName>GlobalWeather</serviceName>

甚至完全省略参数,让插件自动生成(因为只有一项服务)。


还有其他与您当前配置相关的注意事项最好更改:

  • 永远、永远不要在主源目录 src/main/java 中生成代码,就像目前

    所做的那样
    <src.generated.dir>src/main/java</src.generated.dir>
    

    生成的代码应始终放在构建目录下(即默认情况下 target)。这是因为生成的代码不是真正的源文件,不应在 version-control 上签入。默认情况下,这就是插件正在做的事情,在 target/generated-sources/cxf 中生成代码,我建议您继续这样做;因此,您只需要删除 <sourceRoot>${src.generated.dir}</sourceRoot>。它还会自动将生成的源代码添加为源文件夹,因此一切仍会编译。

  • 您不需要 xerces 插件的依赖性,您可以删除插件的整个 <dependencies> 部分。

  • 没有 <wsdlLocation> 参数,所以你也可以删除它,它没有任何作用。