如何在Gradle中通过Apache CXF的WSDLToJava批量移除生成类的Type后缀
统一修改CXF WSDLToJava生成的所有类名(无需逐个配置)
刚好我之前也遇到过类似的需求——不想为每个WSDL/XSD元素单独写绑定规则,要全局统一修改生成的类名。其实CXF提供了自定义命名器(Namer)的扩展机制,完全可以一次性搞定所有类的命名规则,不用逐个配置绑定文件,下面给你详细说怎么实现:
核心思路:自定义CXF命名器(Namer)
CXF的WSDLToJava工具允许我们通过继承默认的DefaultNamer类(或直接实现Namer接口)来重写类名生成逻辑,这样就能全局统一应用你的命名规则,比如去掉所有类名末尾的Type后缀。
步骤1:实现自定义命名器类
创建一个Java类,继承CXF的DefaultNamer,重写getClassName方法来实现你的命名转换逻辑。针对你给出的例子,我们需要把所有以Type结尾的类名去掉这个后缀:
package com.yourpackage; import org.apache.cxf.tools.common.DefaultNamer; import org.apache.cxf.tools.common.ToolContext; public class CustomClassNameNamer extends DefaultNamer { @Override public String getClassName(String originalName, ToolContext context) { // 处理以"Type"结尾的类名 if (originalName != null && originalName.endsWith("Type")) { return originalName.substring(0, originalName.length() - 4); } // 其他情况保留默认命名逻辑(比如非Type结尾的元素) return super.getClassName(originalName, context); } }
如果之后需要调整命名规则(比如统一添加前缀、转换大小写),直接修改这个方法里的逻辑就行,非常灵活。
步骤2:在Gradle中配置WSDLToJava任务使用自定义命名器
接下来要在你的Gradle任务里指定使用这个自定义命名器,分两种常见配置方式:
方式一:直接使用JavaExec执行WSDLToJava
如果是用JavaExec直接调用CXF的工具类,配置如下:
task generateWsdlJava(type: JavaExec) { // 指定CXF的主类 main = 'org.apache.cxf.tools.wsdlto.WSDLToJava' // 确保自定义命名器类在classpath中 classpath = sourceSets.main.compileClasspath + sourceSets.main.output // 配置生成参数 args = [ '-d', "$buildDir/generated-sources/wsdl", // 生成代码的输出目录 '-cn', 'com.yourpackage.CustomClassNameNamer', // 指定自定义命名器的全类名 'src/main/resources/your-service.wsdl' // 你的WSDL文件路径 ] } // 让编译任务依赖代码生成任务 compileJava.dependsOn(generateWsdlJava)
方式二:使用cxf-codegen-plugin Gradle插件
如果你的项目用了官方的CXF Gradle插件,配置会更简洁:
plugins { id 'java' id 'org.unbroken-dome.cxf-codegen' version '7.0.0' // 建议使用最新稳定版本 } cxfCodegen { wsdl = file('src/main/resources/your-service.wsdl') outputDir = file("$buildDir/generated-sources/wsdl") // 添加自定义命名器参数 extraArgs = [ '-cn', 'com.yourpackage.CustomClassNameNamer' ] } compileJava.dependsOn(cxfCodegen)
验证效果
执行Gradle的generateWsdlJava(或cxfCodegen)任务后,生成的类名就会完全符合你的预期:
- 原
SomeType→Some - 原
Some2Type→Some2 - 原
Some3Type→Some3
这种方式的好处是全局生效,不管WSDL/XSD里有多少元素,都不用逐个写绑定规则,完美解决你要的通用解决方案。
内容的提问来源于stack exchange,提问作者arpit sharma
相关产品推荐
相关产品推荐

