1.问题描述
通过@Autowired public DmUserMapper dmUserMapper;注入,程序运行的时候出现null空指针异常的情况。
2.出现问题的原因
关于Spring Boot中的@Autowired
注解的使用,通常是由Spring的上下文(ApplicationContext)还未完全初始化导致的。如果在创建Bean的过程中就尝试注入依赖,而这些依赖还没有被Spring完全管理,那么它们可能会是null
。这通常发生在以下几种情况:
1.Bean创建顺序问题:
如果尝试注入的Bean在创建当前Bean时还没有被初始化,那么注入的Bean将是null
。
2.配置问题:
可能是由于Spring配置错误,导致Spring无法找到或创建相应的Bean实例。
3.组件扫描问题:
Spring可能没有扫描到Mapper类,因此无法为其创建Bean。
3.解决方案
在service层中使用了构造器注入而不是字段注入。构造器注入确保了当 Bean被创建时,所有的依赖都已经被Spring初始化和注入,这样可以避免null
的问题。确保Mapper接口在Spring的组件扫描路径下,并且正确使用了@Mapper
或@Repository
注解。下面是一个示例:
private final UserDrugRulesMapper userDrugRuleRepository;
private final DmUserMapper userRepository;
private final DmDrugInformationMapper drugInformationRepository;
private final WxTemplateMessageLogMapper mappers;
private final WechatConst wechatConst;
private final Wechat wechat;
@Autowired
public MedicationReminderTask(UserDrugRulesMapper userDrugRuleRepository,
DmUserMapper userRepository,
DmDrugInformationMapper drugInformationRepository,
WxTemplateMessageLogMapper mappers,
WechatConst wechatConst,
Wechat wechat) {
this.userDrugRuleRepository = userDrugRuleRepository;
this.userRepository = userRepository;
this.drugInformationRepository = drugInformationRepository;
this.mappers = mappers;
this.wechatConst = wechatConst;
this.wechat = wechat;
}
在controller中
private final MedicationReminderTask medicationReminderTask;
@Autowired
public WechatController(MedicationReminderTask medicationReminderTask) {
this.medicationReminderTask = medicationReminderTask;
}