Gradle任务未将WSDL的wsdl:portType映射为服务端点接口求助
问题原因及解决方案
核心原因
你当前使用的xjc工具仅负责从XML Schema(包括WSDL内嵌的<types>部分)生成Java实体类,不支持解析wsdl:portType生成服务端点接口。xjc -wsdl参数只是让工具读取WSDL文件中的schema定义,而非完整处理WSDL的服务契约部分。
要生成服务端点接口,必须使用JAX-WS的wsimport工具——它会完整解析整个WSDL文档,生成实体类、服务端点接口、客户端服务类等全套代码。
具体修复步骤
1. 调整依赖配置
移除无用的jxc-core依赖,添加JAX-WS工具包依赖:
dependencies { // 原有其他依赖保留 jaxws 'com.sun.xml.ws:jaxws-tools:2.3.3' jaxws 'com.sun.xml.ws:jaxws-rt:2.3.3' }
2. 替换Gradle任务为wsimport
将原genJaxb任务修改为调用wsimport的任务(注意修正代码路径,原java/main应为标准的src/main/java):
task genJaxws { ext.sourcesDir = "${projectDir}/src/main/java" ext.classesDir = "${buildDir}/classes/main" ext.wsdl = "src/main/resources/wsdl_file.wsdl" outputs.dir classesDir doLast() { project.ant { taskdef name: "wsimport", classname: "com.sun.tools.ws.ant.WsImport", classpath: configurations.jaxws.asPath mkdir(dir: sourcesDir) mkdir(dir: classesDir) wsimport( destdir: sourcesDir, wsdl: wsdl, package: "com.example.consumingwebservice.wsdl", keep: true, // 保留生成的.java源文件 verbose: true ) { produces(dir: sourcesDir, includes: "**/*.java") } javac(destdir: classesDir, source: 1.8, target: 1.8, debug: true, debugLevel: "lines,vars,source", classpath: configurations.jaxws.asPath) { src(path: sourcesDir) include(name: "**/*.java") } copy(todir: classesDir) { fileset(dir: sourcesDir, erroronmissingdir: false) { exclude(name: "**/*.java") } } } } }
3. 执行任务生成代码
运行以下命令生成完整的SOAP客户端代码:
./gradlew genJaxws
执行后,你会在com.example.consumingwebservice.wsdl包下看到:
- 从
xs:complexType/xs:element生成的实体类 - 从
wsdl:portType生成的服务端点接口(命名通常为[PortTypeName]) - 从
wsdl:service生成的客户端服务类(命名通常为[ServiceName])
内容的提问来源于stack exchange,提问作者Bigon
相关产品推荐
相关产品推荐

