专栏首页王磊的博客@Autowired报错原因分析和4种解决方案!

@Autowired报错原因分析和4种解决方案!

上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? ​

报错原因分析

报错的原因首先是因为 IDEA 强大的报警机制,@Autowired 为 Spring 的注解,含义是将某类动态的注入到当前类中,如下图所示:

@Autowired 默认是根据 type 进行注入,并且注入时要求(注入)对象不能为 NULL,默认值如下图所示:

IDEA 报错的原因是:@Autowired 为 Spring 的注解,而注入的 Mapper 对象使用的又是 @Mapper 的注解,然而 @Mapper 又为 MyBaits 的注解,IDEA 能很好的兼容并识别 Spring 的注解,但不能很好的识别 MyBatis 的注解,因此在使用 @Autowired 注解时,IDEA 并不能检测到 @Mapper 注解的对象不为 NULL,因此就会报错。

这就是为什么使用 Spring 的注解 @Repository/@Component... 不报错,而使用 @Mapper 注解却会报错的根本原因,如下图所示:

解决方案1:关闭报警机制

关闭 IDEA 注入报警机制,可以避免报错,实现步骤如下。 ​

1.打开 IDEA,找到参数设置选项 “Preferences...” ,如下图所示:

2.依次选择 “Editor” -> “Inspections” -> “Spring” -> “Spring Core” -> “Code” -> “Autowiring for bean class” 将 “Error” 级别修改成 “Waring” 级别,如下图所示:

设置完成之后点击确认,查看之前报错的 Mapper 类,此时展示效果如下:

报错信息消失了。 ​

解决方案2:添加Spring注解

在 Mapper 的类上添加 Spring 的注解,也可以解决 IDEA 报错的问题,如 @Repository 或 @Component 这类注解,如下图所示:

或使用 @Repository 注解,如下图所示:

查看之前的报错信息:

报错消失了。

解决方案3:允许注入对象为NULL

设置允许注入的 Mapper 对象为 NULL,也可以避免 IDEA 报错,只需要设置 @Autowired(required=false) 即可,如下图所示:

(其中 userMapper2 对象就不报错了)

  • @Autowired(required=true):表示当使用 @Autowired 注解的时候,该 bean 必须存在,否则注入失败,默认值。
  • @Autowired(required=false):表示忽略当前要注入的 bean,如果有直接注入,没有则跳过,不会报错。

@Autowired 默认值的实现源码:

解决方案4:使用@Resource注解

使用 @Resource 注解替换 @Autowired 注解也可以避免报错,它们的对比效果如下:

@Resource 注解和 @Autowired 注解以当前的场景来说,它们的主要区别是 @Resource 是 Java 自身提供的注解,而 @Autowired 是 Spring 提供的注解,@Autowired 默认值为 required=true,所以必须要一个非 NULL 的对象,当 IDEA 检测不到对象为 NULL 时就会报错,而 @Resource 并没有这项要求。

总结

使用 @Autowired 注解导入 Mapper 对象报错的原因,是因为 @Autowired 默认情况下,需要注入一个非 NULL 的对象,而被 @Mapper 修饰的类为 MyBatis 的注解,IDEA 并不能很好的识别其为非 NULL 对象,因此就会报错。当然,它的解决方案也有很多,推荐使用 @Resource 替代 @Autowired 注解的方式来解决此问题。 ​

更多 Spring 干货,关注公众号「Java中文社群」,实时获取。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • @Autowired报错的4种解决方案和原因分析!

    大家好,我是跃哥。相信大家平时在使用Java 的时候经常会用到 @Autowired,相当好用有木有。但是,不知道你使用的时候有没有遇到过报错呢?今天,跃哥就带...

    程序员小跃
  • 转 svn: E170001报错的原因以及解决方案

    Java学习123
  • 教你分析9种 OOM 常见原因及解决方案

    专栏地址:https://github.com/StabilityMan/StabilityGuide

    用户5927304
  • 13.5 SpringBoot应用启动错误org.apache.catalina.LifecycleException错误日志原因分析解决方案

    13.5 SpringBoot应用启动错误org.apache.catalina.LifecycleException

    一个会写诗的程序员
  • Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition问题描述:原因分析:解决方案:

    在Java代码中,我们是不推荐带有变长参数的方法重载的。这样的代码调用人类阅读起来会感到“模糊”。

    一个会写诗的程序员
  • 运行map()后,报:<map object at 0x02629E50>解决方法与原因分析

    1 如下python 3例子: l = range(1,21) def op(x): r = 1 for i in range(1,x + 1)...

    学到老
  • 13.2 Spring Boot启动报错:Whitelabel Error Page13.2 Spring Boot启动报错:Whitelabel Error Page问题描述原因分析解决方案

    首先,这个出错页面是SpringBoot的一个默认出错页面。源码在:org.springframework.boot.autoconfigure.web.ser...

    一个会写诗的程序员
  • Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    装饰器(Decorator)是 Python 非常实用的一个语法糖功能。装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”。其目的是在不对现有函数进...

    霍格沃兹测试开发
  • 本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案

    因为要更新数据库加个表,远程桌面又无法连接。。。所以就远程到另外一台电脑,然后用navicat通过内网修改目标数据库。

    木子墨
  • Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

    可以看到 userMapper 下有个红色警告。虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心。本文分析原因,并列出解决该警告的几种方案。

    用户1516716
  • 【小家Spring】控制Spring IoC容器对Bean(含@Configuration配置类)的加载顺序(@DependsOn注解的使用)

    首先,先说明一点:此篇博文相对来说是比较小的专题,只讲解Spring IoC加载Bean的顺序问题。 为了更好的了解这里面的原理,建议先了解Spring容器内...

    YourBatman
  • 数据库死锁问题原因分析以及解决方案

    对于存在多用户并发访问的项目,如果遇到了数据库deadLock 时 ,我们如何根据服务器的日志进行排查原因呢?

    爱明依
  • 一种海量日志存储、分析解决方案V1.1 原

    针对上一个版本https://my.oschina.net/shyloveliyi/blog/786337,有如下更新:

    尚浩宇
  • 一种海量日志存储、分析解决方案V1.0 原

        flume,版本1.7.0,主要用来从业务系统收集数据以及从jms收集数据。

    尚浩宇
  • 运行map()后,报:map object at 0x026427B0 解决方法与原因分析

    这种情况是因为在python3里面,map()的返回值已经不再是list,而是iterators, 所以想要使用,只用将iterator 转换成list 即可,...

    学到老
  • Java虚拟机内存溢出原因分析以及解决方案

    在Java虚拟机规范的描述之中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有可能发生内存溢出OutOfMemoryError(OOM)异常的可能。

    爱明依
  • Java for Windows Missing问题原因分析以及完美解决方案

    写java的工具目前多的真是数不胜数,但是写java之前很让人头疼的一件事情是配置环境,有的时候即使配置环境结束了还是会出现这或者那样的问题,今天我们不...

    何处锦绣不灰堆
  • RocketMQ 消息发送system busy、broker busy原因分析与解决方案

    最近收到很多RocketMQ使用者反馈在消息发送过程中偶尔会出现如下4个错误信息之一:

    丁威
  • @Autowired的这些骚操作,你都知道吗?

    最近review别人代码的时候,看到了一些@Autowired不一样的用法,觉得有些意思,特定花时间研究了一下,收获了不少东西,现在分享给大家。

    Bug开发工程师

扫码关注云+社区

领取腾讯云代金券