You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 04:39:01