如何配置MapStruct不使用Lombok Builder(无需删除@Builder注解)
解法1:针对单个映射方法禁用Builder(最灵活)
直接在需要禁用Builder的映射方法上添加@BeanMapping注解即可,不需要修改全局配置,也不用删除类上的@Builder注解:
@Mapper(componentModel = "spring") class UserRestMapper { // 注意这里的Builder是org.mapstruct.Builder,不要和Lombok的Builder混淆 @BeanMapping(builder = @org.mapstruct.Builder(disableBuilder = true)) public abstract UserDto map(User obj); @AfterMapping public void decorate(User source, @MappingTarget AuditableEntityBase target) { // 此时方法会正常被调用,target为映射完成的实例对象 } }
解法2:全局禁用Builder特性
如果项目所有映射场景都不需要用到Builder,可以直接修改编译参数全局关闭该特性:
- Maven项目修改
maven-compiler-plugin配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessorPaths> <!-- 原有lombok、mapstruct的依赖配置不变 --> </annotationProcessorPaths> <compilerArgs> <arg>-Amapstruct.disableBuilder=true</arg> </compilerArgs> </configuration> </plugin>
- Gradle项目修改
build.gradle配置:
compileJava { options.compilerArgs += ['-Amapstruct.disableBuilder=true'] }
注意事项
由于你用到了@Value注解的不可变类,加@Builder后默认生成的全参构造函数会被设为private,禁用Builder后MapStruct需要通过构造函数实例化对象,所以需要给对应的类手动添加公共全参构造:
@Value @Builder @AllArgsConstructor(access = AccessLevel.PUBLIC) public class UserDto extends AuditableEntityBaseDto { // 原有属性保持不变 }
内容的提问来源于stack exchange,提问作者edbras
相关产品推荐
相关产品推荐

