迁移至Jakarta依赖后,如何用JAXB生成带值构造函数的Java代码?
解决方案:迁移至Jakarta JAXB并生成全参构造函数
下面提供几种可行方案,帮你从XSD生成基于Jakarta依赖且同时包含默认构造函数与全参构造函数的Java代码:
方案1:使用Jakarta适配版的JAXB Commons工具(推荐)
原jaxb2-value-constructor插件已迁移至jaxb-tools项目,该项目完全适配Jakarta EE规范,可配合支持Jakarta的Maven XJC插件使用:
配置示例(基于com.helger.maven的jaxb40-maven-plugin)
<plugin> <groupId>com.helger.maven</groupId> <artifactId>jaxb40-maven-plugin</artifactId> <version>4.0.0</version> <!-- 建议使用最新稳定版 --> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <!-- 保留你原有的XSD路径等配置 --> <args> <arg>-Xvalue-constructor</arg> </args> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.jvnet.jaxb</groupId> <artifactId>jaxb-tools</artifactId> <version>4.0.2</version> <!-- 版本需与插件的Jakarta适配版本匹配 --> </dependency> </dependencies> </plugin>
jaxb-tools包含原jaxb2-commons的所有扩展插件(包括value-constructor),生成的代码完全基于Jakarta API。
方案2:用Lombok补全构造函数
若暂时找不到适配的XJC插件,可先通过标准Jakarta JAXB插件生成仅带默认构造函数的代码,再借助Lombok自动生成全参构造函数:
步骤详情:
- 使用标准Jakarta JAXB Maven插件生成基础代码:
<plugin> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-maven-plugin</artifactId> <version>4.0.4</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <!-- 你的XSD相关配置 --> </configuration> </execution> </executions> </plugin>
- 创建
bindings.xjb绑定文件,自动为生成的类注入Lombok注解:
<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" version="3.0"> <jaxb:globalBindings> <!-- 为所有生成类添加Lombok的无参、全参构造注解 --> <jaxb:class name="*"> <jaxb:annotations> <annox:annotate target="class"> <annox:annotation type="lombok.AllArgsConstructor"/> <annox:annotation type="lombok.NoArgsConstructor"/> </annox:annotate> </jaxb:annotations> </jaxb:class> </jaxb:globalBindings> </jaxb:bindings>
- 在Maven插件中引入依赖,支持注解自动注入:
<dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </dependency> </dependencies>
最后在插件配置中绑定上述文件:
<configuration> <bindingFiles> <bindingFile>bindings.xjb</bindingFile> </bindingFiles> </configuration>
方案3:自定义XJC插件
如果上述方案都无法满足需求,可编写简单的自定义XJC插件,在代码生成阶段自动为类添加全参构造函数。自定义插件需实现com.sun.tools.xjc.Plugin接口,重写run方法修改生成的类结构,再将插件打包引入到Maven插件的依赖中。该方式灵活性最高,但需要额外的开发工作量。
内容的提问来源于stack exchange,提问作者Philipp Kemkes
相关产品推荐
相关产品推荐

