上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 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中文社群」,实时获取。

@Autowired报错原因分析和4种解决方案!的更多相关文章

  1. MySQL server has gone away报错原因分析/

    在平时和开发的交流 以及 在论坛回答问题的或称中会发现这个问题被问及的频率非常高. 程序中报错: MySQL server has gone away 是什么意思? 如何避免? 因此,感觉有必要总结一 ...

  2. 黄聪:Wordpress、PHP使用POST数据过大导致MySQL server has gone away报错原因分析

    错误原因: 当POST的数据超过 max_allowed_packet 就会报 MySQL server has gone away 的错误. 1.查看当前Mysql的 max_allowed_pac ...

  3. sqlserver-一次updlock和withnolock和with check option 的报错原因分析

    接口程序一直运行的很稳定,其中有一天进行了数据库的整改,导致程序不断报错, 报错信息如下 原因: 程序代码写入以下代码 select * from ViewName with(updlock) whe ...

  4. MySQL server has gone away报错原因分析及解决办法

    原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...

  5. pandas.read_csv() 报错 OSError: Initializing from file failed,报错原因分析和解决方法

    今天调用pandas读取csv文件时,突然报错“ OSError: Initializing from file failed ”,我是有点奇怪的,以前用的好好的,read_csv(path)方法不是 ...

  6. g++报错原因分析:expected class-name before ‘{’ token

    今天写程序的时候, 遇到这样一个错误expected class-name before ‘{’ token 最后发现原来是我的头文件声明没有加. 继承时不要忘记加基类的头文件 错误: class F ...

  7. 一个坑爹的Swift报错原因分析与解决方案

    有时候在实际开发中,完全没有任何问题.但是一到实机测试,就会直接卡机   let count = scoreStorage.count return scoreStorage[Int(arc4rand ...

  8. Missing android.support.FILE_PROVIDER_PATHS meta-data 报错原因分析

    此类错误多半因为拼写错误导致.有StackOverflow上便有网友将"FILE_PROVIDER_PATHS"误写成"FILE_PROVIDE_PATHS"的 ...

  9. SAP SOAMANAGER报错原因与故障排除方法

    一些刚刚接触到SAP Webservice的开发者由于对SAP Netweaver组件的不熟悉,往往在使用事物码SOAMANAGER进行webservice配置的时候,发现无法正常启动SOAMANAG ...

随机推荐

  1. Iperf3网络性能测试工具详解教程

    Iperf3网络性能测试工具详解教程 小M 2020年4月17日 运维 本文下载链接 [学习笔记]Iperf3网络性能测试工具.pdf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保 ...

  2. ltp循环跑

    e]# cat r3.sh#!/bin/bashi=1for ((; i<=1000; i++))do/opt/ltp/runltp -s fmtmsg01 -p -l -t -l /home/ ...

  3. 源码安装Python3

    源码安装Python3 一.安装Python3需要的依赖包 [root@localhost ~]# yum install -y gcc make wget openssl openssl-devel ...

  4. C语言scanf跳出循环的问题

    注意:%C前面有个空格,如果不加空格,会跳出while循环. 第一次输入的时候,回车键会滞留在输入缓冲区,第二次要去输的时候,会直接去读回车键 在第二次要去输入的时候,可以先清除缓冲区,用getcha ...

  5. Centos7 vsftpd虚拟用户权限控制(vsftpd虚拟用户限制IP访问)

    实验目标:(新增限制虚拟机用户登陆的IP) 实现在同一跟目录下对admin,upload,download三个虚拟用户的不同权限的控制.具体权限控制列表如下: 用户名 权限说明 admin 管理员,可 ...

  6. C语言编程 菜鸟练习100题(01-10)

    [练习1]输出 "Hello, World!" 0. 题目: 输出 "Hello, World!" 1. 分析: 使用 printf() 输出 "He ...

  7. 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录

    目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 Python语言是目前很火热的语言,极大的促进了人工智能发展.你知道在ArcGIS中也会有python的身影吗?事实上,在ArcG ...

  8. WEB安全防护相关响应头(下)

    前篇"WEB安全防护相关响应头(上)"中,我们分享了 X-Frame-Options.X-Content-Type-Options.HTTP Strict Transport Se ...

  9. GO语言的JSON02---反序列化

    package main import ( "encoding/json" "fmt" ) type Human struct { Name string Ag ...

  10. Python+Selenium - Alert弹框

    上面三种弹窗可以在浏览器的控制台做出效果,如下图 上面三种弹窗可以用alert方法处理 示例: #出现弹窗的操作xxxx# 切换al = driver.switch_to.alert# print(a ...