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

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

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


往期推荐

SpringBoot 中的 3 种条件装配!


SpringBoot 过滤器、拦截器、监听器对比及使用场景!


Spring为什么建议构造器注入?



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Winform 窗体美化(一、IrisSkin 换肤库)

IrisSkin 换肤库 IrisSkin 是为Microsoft Visual Studio dotNET开发的最易用的界面增强dotNET(WinForm)组件包。能完全自动的为应用程序添加支持换肤功能。[百度百科] 1、文件 IrisSkin4.dll - 544 KB各种 .ssk 格式的皮肤文件(一般在网上搜的是13个皮肤的压缩包…

java double方法_Java Double类compare()方法与示例

java double方法双类compare()方法 (Double class compare() method) compare() method is available in java.lang package. compare()方法在java.lang包中可用。 compare() method is used to check equality or inequality of the given two double values or in other word…

MySQL开发规范

命名规范> 库名、表名、字段名必须使用小写字母并采用下划线分割> 库名、表名、字段名禁止超过32个字符,须见名知意 * 库名、表名、字段名支持最多64个字符,统一规范、易于辨识以及减少传输量不要超过32> 库名、表名、字段名禁止使用MySQL…

厉害了,Spring中bean的12种定义方法!

前言在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜。我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工作中的多种业务场景。那么问题来了&#xff0…

C# Winform 窗体美化(二、LayeredSkin 界面库)

二、LayeredSkin 界面库 概况 这部分资源是 Winform 美化最多的了,效果还不错,使用时只需引入 LayeredSkin.dll - 696 KB 即可。 网上能找到的最后 LayeredSkin 版本应该是 LayeredSkin Demo2014-12-10.zip,之后作者就整合成一个更加强大的…

Java Currency getInstance()方法与示例

货币类getInstance()方法 (Currency Class getInstance() method) Syntax: 句法: public static Currency getInstance(Locale lo);public static Currency getInstance(String curr_code);getInstance() method is available in java.util package. getInstance()…

【WebSocket初探 】

众所周知,socket是编写网络通信应用的基本技术,网络数据交换大多直接或间接通过socket进行。对于直接使用socket的client与服务端,一旦连接被建立则均可主动向对方传送数据,而对于使用更上层的HTTP/HTTPS协议的应用,因…

Spring Cache 实战:兼容所有缓存中间件!

作者 | 悟空聊架构来源 | 悟空聊架构(ID:PassJava666)本篇给大家介绍一种兼容所有缓存中间件的方案,不论我们是使用 Redis 还是 Ehcache,都不需要关心如何操作 Redis 或者 Ehcache,这套方案统统帮你搞定。这…

C# Winform 窗体美化(三、不规则窗体)

三、不规则窗体 概况 之前学习的 LayeredSkin 看到里面有个异形窗口,比较感兴趣,所以就找一下资料研究一下。不规则窗体学习有一个比较好的例子,叫 GoldFishProject,是一条鱼金鱼在屏幕上游。 不规则窗口示例代码 GoldFishProj…

Mybatis中SQL注入攻击的3种方式,真是防不胜防!

作者 | sunnyf来源 | https://www.freebuf.com/vuls/240578.html前言SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知…

Hadoop源代码分析(MapReduce概论)

大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档。在分析Hadoop的MapReduce部分前,我们还是先了解系统是如何工作的&…

Java CharArrayWriter size()方法与示例

CharArrayWriter类的size()方法 (CharArrayWriter Class size() method) size() method is available in java.io package. size()方法在java.io包中可用。 size() method is used to get the current size of this buffer (CharArrayWriter). size()方法用于获取此缓冲区的当前…

C# Winform 窗体美化(四、镂空窗体)

四、镂空窗体 例子下载 如果没有积分,可以关注公众号找一下【大鱼code】 直接贴效果图吧: 1、控件的透明 [外链图片转存中…(img-d0Kky9yO-1655564321951)] 2、窗体的透明 [外链图片转存中…(img-zF1WTwWl-1655564321952)] 代码如下: p…

再有人问你MySql的隔离级别,直接把这篇文章发给他!

作者 l zyz1992来源 l Hollis(ID:hollischuang)首先要明白什么是事务?事务是程序中一系列严密的操作,所有的操作必须完成,否则在所有的操作中所做的所有的更改都会被撤销。也就是事务的原子性,一…

Spring与Hibernate两种组合方式

Spring与Hibernate大致有两种组合方式,主要区别是一种是在Hibernate中的hibernate.cfg.xml中配置数据源,一种是借助Spring的jdbc方式在Spring的applicationContext.xml文件中配置数据源,然后在Spring配置sessionFactory的bean有些区别 下面大致的说明一下…

Java CharArrayReader mark()方法与示例

CharArrayReader类mark()方法 (CharArrayReader Class mark() method) mark() method is available in java.io package. mark()方法在java.io包中可用。 mark() method is used to mark the current position in the stream and whenever the call to reset() method so it re…

C# Winform 窗体美化(五、鼠标穿透)

五、鼠标穿透 以前在玩射击游戏的时候,狙击枪的设定一般是开镜才有准星,所以想是不是可以自己造一个默认准星出来,思路是现在窗口上画一个准星,然后把窗体其他区域都透明,然后设置鼠标穿透; 结果是&#…

生产环境一次诡异的NPE问题,反转了4次

前言公司为了保证系统的稳定性,加了很多监控,比如:接口响应时间、cpu使用率、内存使用率、错误日志等等。如果系统出现异常情况,会邮件通知相关人员,以便于大家能在第一时间解决隐藏的系统问题。此外,我们这…

ZooKeeper学习笔记—配置管理

为什么80%的码农都做不了架构师?>>> 最近在工作中,为了完善公司集群服务的架构,提高可用性,降低运维成本,因此开始学习ZooKeeper。 至于什么是ZooKeeper?它能做什么?如何安装ZooKee…

Java BigDecimal compareTo()方法与示例

BigDecimal类compareTo()方法 (BigDecimal Class compareTo() method) compareTo() method is available in java.math package. compareTo()方法在java.math包中可用。 compareTo() method is used to compare this BigDecimal object to the given object or in other words …