如何为jaxb2-maven-plugin生成的类添加必填参数构造方法?
为JAXB生成类添加必填参数构造方法或Lombok @RequiredArgsConstructor的方案
方案一:通过JAXB扩展生成指定必填参数的构造方法
你提到的org.jvnet.jaxb2_commons:jaxb2-value-constructor其实支持自定义必填字段,不需要强制生成全参构造。只需通过JAXB绑定文件(如bindings.xjb)配置即可:
- 绑定文件头部引入value-constructor命名空间:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:vc="http://jaxb2-commons.dev.java.net/value-constructor" jaxb:extensionBindingPrefixes="xjc vc" jaxb:version="2.1">
- 针对目标类配置必填字段:
<!-- 单个类配置:指定field1、field2为构造参数 --> <jaxb:bindings schemaLocation="your-schema.xsd" node="/xs:schema/xs:complexType[@name='YourClass']"> <vc:value-constructor fields="field1 field2"/> </jaxb:bindings> <!-- 全局配置:自动识别Schema中标记为必填(minOccurs="1"且无默认值)的字段生成构造 --> <jaxb:bindings schemaLocation="your-schema.xsd" node="/xs:schema"> <vc:value-constructor use-optional="false"/> </jaxb:bindings>
- Maven插件中引入扩展依赖:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-value-constructor</artifactId> <version>3.0.0</version> </dependency> </dependencies> <configuration> <bindingFiles> <bindingFile>src/main/resources/bindings.xjb</bindingFile> </bindingFiles> </configuration> </plugin>
方案二:添加Lombok @RequiredArgsConstructor注解
方式1:生成时直接注入注解
使用jaxb2-annotate-plugin在类生成阶段直接添加Lombok注解:
- 绑定文件配置注解注入:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="xjc annox" jaxb:version="2.1"> <!-- 给单个类添加注解 --> <jaxb:bindings schemaLocation="your-schema.xsd" node="/xs:schema/xs:complexType[@name='YourClass']"> <annox:annotateClass>lombok.RequiredArgsConstructor</annox:annotateClass> </jaxb:bindings> <!-- 全局给所有生成类添加注解 --> <jaxb:bindings schemaLocation="your-schema.xsd" node="/xs:schema"> <annox:annotateClass>lombok.RequiredArgsConstructor</annox:annotateClass> </jaxb:bindings> </jaxb:bindings>
- Maven插件配置依赖:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-annotate-plugin</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>src/main/resources/bindings.xjb</bindingFile> </bindingFiles> </configuration> </plugin>
方式2:生成后批量添加注解
用maven-replacer-plugin在生成完成后批量替换代码添加注解:
<plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>replacer</artifactId> <version>1.5.3</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>replace</goal> </goals> </execution> </executions> <configuration> <filePattern>target/generated-sources/xjc/**/*.java</filePattern> <replacements> <replacement> <token>public class</token> <value>import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class</value> </replacement> </replacements> </configuration> </plugin>
若需针对特定类,可调整filePattern或使用更精准的正则匹配。
内容的提问来源于stack exchange,提问作者olimtrail
相关产品推荐
相关产品推荐

