关于根据字段注入无法成功的bug

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;
    }

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值