作者|王磊来源|Java中文社区(ID:javacn666)请联系授权(微信ID:GG_Stone)转载相信大部分程序员都遇到过上图的错误信息。完全不影响程序的正常执行,即编译器IDEA虽然报错,但程序可以正常执行。这是什么原因?报错原因分析报错的原因首先是因为IDEA强大的告警机制,@Autowired是Spring的一个注解,意思是动态注入某个类到当前类中,如图下图:@Autowired默认是根据类型进行注入,要求(注入的)对象在注入时不能为NULL,默认值如下图:IDEA报错的原因是:@Autowired是一个Spring注解,注入的Mapper对象使用@Mapper注解,但是@Mapper也是MyBaits的注解,IDEA可以很好的兼容识别Spring注解,但是不能很好的识别MyBatis的注解,所以在使用@的时候Autowired注解,IDEA无法检测到@Mapper注解的对象不为NULL,所以会报错。这就是为什么使用Spring的注解@Repository/@Component...不报错,而使用@Mapper注解会报错的根本原因,如下图:解决方案一:关闭告警机制转关闭IDEA注入告警机制,避免报错,实现步骤如下。1、打开IDEA,找到参数设置选项“Preferences...”,如下图:2、选择“Editor”->“Inspections”->“Spring”->“SpringCore”->“Code”"->"Autowiringforbeanclass"将"Error"级别改为"Waring"级别,如下图:设置完成后,点击确定,可以查看之前报错的Mapper类,显示效果如下:错误信息消失。方案二:添加Spring注解在Mapper类中添加Spring注解也可以解决IDEA报错的问题,比如@Repository或者@Component等注解,如下图:或者使用@Repository注解,如下图下图:检查之前的错误信息:错误信息消失了。解决方案三:允许注入对象为NULL将允许注入的Mapper对象设置为NULL,也可以避免IDEA报错,只需设置@Autowired(required=false)即可,如下图:(userMapper2对象不会报错)@Autowired(required=true):表示使用@Autowired注解时,bean必须存在,否则注入失败,默认值。@Autowired(required=false):表示忽略要注入的bean。如果有直接注入,会跳过,不会报错。@Autowired默认值的实现源码:方案四:使用@Resource注解将@Autowired注解替换为@Resource注解也可以避免报错。它们的对比效果如下:@Resource注解和@Autowired注解在当前场景下,它们的主要区别是@Resource是Java自己提供的注解,而@Autowired是Spring提供的注解。@Autowired的默认值是required=true,所以需要一个非NULL的对象。当IDEA检测不到对象为NULL时,会报错,但是@Resource没有这个要求。总结一下,之所以使用@Autowired注解导入Mapper对象报错是因为@Autowired默认需要注入一个非NULL对象,而@Mapper修饰的类是MyBatis注解,而IDEA无法将其识别为非NULL对象。NULL对象,所以会报错。当然,有很多解决方法。建议使用@Resource而不是@Autowired注解来解决这个问题。
