1. 概述

简单来说,Web Services Description Language (WSDL) 是一种基于XML的语言,用于描述网络服务提供的功能。WSDL stubs(代理类)是根据WSDL文件自动生成的,使得在不手动创建和管理SOAP消息的情况下与Web服务交互变得更加容易。

在这个教程中,我们将学习如何使用Gradle生成WSDL stubs,并且会看到一个示例WSDL文件,并从中生成代理类。

2. 示例设置

首先,我们创建一个新的Gradle项目,该项目可以从WSDL文件中生成代理类。接下来,我们将为WSDL文件创建目录结构:

$ mkdir -p src/main/resources/wsdl

我们将使用一个公开的WSDL文件,它将数字转换为其文字等价物。让我们下载这个WSDL文件并将其放在wsdl文件夹中:

$ curl -o src/main/resources/wsdl/NumberConversion.wsdl https://www.dataaccess.com/webservicesserver/numberconversion.wso?WSDL

以上命令从dataaccess.com 下载WSDL文件并放置在指定的文件夹中。

在下一节中,我们将配置build.gradle以在示例程序中交互的样例程序中生成可以使用的类。

3. Gradle配置

为了从WSDL文件生成Java类,我们需要一个使用Apache CXF库的插件。本教程中我们将使用的是com.github.bjornvester.wsdl2java,该插件简化了过程并允许我们在gradle.build中进行配置:

plugins {
    id 'java'
    id("com.github.bjornvester.wsdl2java") version "1.2"
}

项目需要两个插件:Java插件帮助我们编译代码、运行测试和创建JAR文件,而WSDL插件则帮助我们从WSDL文件生成Java类。我们都知道,WSDL文件是描述Web服务的XML文档。

我们可以使用wsdl2java扩展来配置WSDL插件:

wsdl2java {
    // ...
}

此外,我们还可以配置CXF版本:

wsdl2java {
    cxfVersion.set("3.4.4")
}

默认情况下,插件为resources文件夹中的所有WSDL文件生成代理类。我们也可以通过指定其位置来为特定的WSDL文件生成代理:

wsdl2java {
    // ...
    includes = [
        "src/main/resources/wsdl/NumberConversion.wsdl",
    ]
    // ... 
}

生成的类保存在build/generated/sources/wsdl2java文件夹中,但我们可以指定自己的文件夹来覆盖这个默认位置:

wsdl2java {
    // ...
    generatedSourceDir.set(layout.projectDirectory.dir("src/generated/wsdl2java"))
    // ... 
}

上述代码中,我们指定了生成类的位置,而不是使用默认文件夹。

配置完成后,我们需要运行Gradle的wsdl2java命令来生成代理类:

$ ./gradlew wsdl2java

这个命令将生成Java类,现在我们可以在程序中与它们交互了。

4. 从WSDL文件生成WSDL代理类

首先,让我们看看示例项目的build.gradle文件:

plugins {
    id 'java'
    id("com.github.bjornvester.wsdl2java") version "1.2"
}
repositories {
    mavenCentral()
}
dependencies {
    implementation 'com.sun.xml.ws:jaxws-ri:4.0.1'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
}
test {
    useJUnitPlatform()
}
wsdl2java {
    cxfVersion.set("3.4.4")
}

上面的示例代码展示了如何配置WSDL插件使用CXF 3.4.4版本。插件将在默认位置生成代理类,并在src/main/resources/wsdl查找WSDL文件,这正是我们之前放置WSDL文件的地方。

此外,为了与服务交互并执行单元测试,我们需要添加Java API for XML Web Services (JAX-WS) 依赖项

要从WSDL文件生成Java类,我们可以执行Gradle的wsdl2java命令:

$ ./gradlew wsdl2java

以下是生成的Java类:

从WSDL文件生成的代理类

生成的类保存在默认位置。接下来,让我们通过编写单元测试来与这些类交互:

@Test
public void givenNumberConversionService_whenConvertingNumberToWords_thenReturnCorrectWords() {
    NumberConversion service = new NumberConversion();
    NumberConversionSoapType numberConversionSoapType = service.getNumberConversionSoap();
    String numberInWords = numberConversionSoapType.numberToWords(BigInteger.valueOf(10000000));
        
    assertEquals("ten million", numberInWords);
}

在上面的示例单元测试中,我们创建了一个NumberConversion的新实例,并在service对象上调用getNumberConversionSoap()方法,以获取NumberConversionSoapType对象的引用。

然后,我们在numberConversionSoapType上调用numberToWords()方法,并传入参数1000000

最后,我们断言预期值等于输出。

5. 总结

在这篇文章中,我们学习了如何使用Gradle生成WSDL代理类。我们还了解了如何自定义插件配置,如指定CXF版本和生成类的输出目录。此外,我们讨论了如何通过编写单元测试与生成的类交互。

如往常一样,示例代码的完整源码可在GitHub上找到。