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类:
生成的类保存在默认位置。接下来,让我们通过编写单元测试来与这些类交互:
@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上找到。