MapStruct抽象Mapper类中@Value注入值为null如何解决
问题原因
MapStruct默认使用独立的组件模型,生成的映射器实现类会通过无参构造自行实例化,不会被注册为Spring容器中的Bean,因此Spring提供的@Value配置注入、@Autowired依赖注入能力都不会生效,类中定义的appName字段无法被赋值,运行时自然为null。
修复方案
优先使用以下配置修复,改动最小:
- 给
@Mapper注解添加componentModel = "spring"参数,指定MapStruct生成的实现类纳入Spring容器管理:
@Mapper(componentModel = "spring") abstract class StudentMapper { // 注意原代码中类名Student和业务实体类重名,建议调整为Mapper后缀命名避免混淆 @Value("${spring.application.name}") String appName; abstract StudentModel convert(StudentDTO studentdto); @AfterMapping void postConvert(@MappingTarget StudentModel studentmodel, StudentDTO studentDTO) { // 原代码此处缺少语句结束分号,需补上 studentmodel.setName(appName); } }
- 后续使用该映射器时,不要通过
Mappers.getMapper()手动获取实例,必须通过@Autowired/构造器注入的方式从Spring容器中获取,否则拿到的实例依然不受Spring管理,注入逻辑不生效。
如果项目同时使用Lombok和MapStruct,需确认pom.xml/gradle中注解处理器的配置顺序,Lombok的注解处理器需要放在MapStruct之前,避免出现注入失效的问题。
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

