MapStruct Spring依赖注入问题:UserMapperHelper为空报空指针
检查Mapper的注入方式
必须通过@Autowired或构造函数注入ReminderCreateMapper,绝对不能手动new实例。MapStruct生成的Spring代理类只有在Spring容器管理下,才会自动初始化内部依赖的UserMapperHelper,手动实例化必然导致依赖为空。确认UserMapperHelper的Spring组件注解
给UserMapperHelper类加上@Component(或@Service)注解,只有被Spring扫描并纳入容器管理的Bean,才能被MapStruct的Mapper自动注入。核对MapStruct与Spring版本兼容性
MapStruct不同版本对Spring的支持逻辑有差异,比如1.x和2.x的组件生成机制不同。建议用MapStruct 2.5+搭配Spring Boot 2.7+或Spring 5.3+,避免版本不兼容导致的注入失败。检查uses属性的配置正确性
确保ReminderCreateMapper的@Mapper注解(是MapStruct的org.mapstruct.Mapper,别搞混其他框架的同名注解)里,正确配置了uses = UserMapperHelper.class,这是MapStruct识别依赖的关键。验证Spring组件扫描范围
确认ReminderCreateMapper、UserMapperHelper、UserServiceImpl所在的包,都被Spring的组件扫描覆盖。可以在启动类上加@ComponentScan(basePackages = {"你的包路径"})明确指定范围,防止因包路径问题导致Bean未加载。单独测试UserMapperHelper的注入
写个简单测试类,注入UserMapperHelper并调用其方法。如果这里也抛空指针,说明问题出在UserService或UserRepository的注入上——检查UserServiceImpl是否加了@Service,UserRepository是否正确继承Spring Data接口且被扫描到。查看MapStruct生成的代理类代码
找到target/generated-sources/annotations目录下的ReminderCreateMapperImpl类,看里面userMapperHelper的注入逻辑。正常应该是构造函数注入或@Autowired字段注入,如果生成的代码里没有这段逻辑,大概率是你的注解配置有误。
内容的提问来源于stack exchange,提问作者mighty-Lebedev

