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

相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码:
在这里插入图片描述
可以看到 userMapper 下有个红色警告。虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心。本文分析原因,并列出解决该警告的几种方案。

原因

众所周知,IDEA是非常智能的,它可以理解Spring的上下文。然而 UserMapper 这个接口是Mybatis的,IDEA理解不了。

而 @Autowired 注解,默认情况下要求依赖对象(也就是 userMapper )必须存在。而IDEA认为这个对象的实例/代理是个null,所以就友好地给个提示。

解决方案

方法1:为 @Autowired 注解设置required = false
使用 @Autowired 注解时,若希望允许null值,可设置required = false,像这样:

@Autowired(required = false)
private UserMapper userMapper;

这样就不会有警告了。原因很好理解:IDEA认为userMapper是个null,给了警告;加上required = false后,使用 @Autowired 注解不再去校验userMapper是否存在了。也就不会有警告了。

总结:这种方式有点蛋疼。一个庞大的既有项目,可能到处都在引用Mapper,总不能到处都补上 required = false 吧……而且对于新手/新员工,很难一眼看懂加required = false属性只是为了解决IDEA的警告。

方法2:用 @Resource 替换 @Autowired

像这样:

@Resource
private UserMapper userMapper;
这样也不会再有讨厌的警告。如果你对原因感兴趣,不妨了解一下添《@Autowired 与@Resource的区别》

总结:

这种方式挺赞,但如果一个项目已经大量使用@Autowired,然后为了个警告到处改成@Resource,也有点蛋疼。

方法3:在Mapper接口上加上@Repository注解

像这样:

@Repository
public interface UserMapper extends Mapper<User> {
}
这样也能让你的@Autowired
private UserMapper userMapper;

不再报错。

当然,如果你用@Component替换@Repository也是可以的。原理大致:IDEA不是认为 userMapper 是个null嘛…加个@Repository注解骗一下IDEA就OK了……

总结:这种方式比较赞,改动小,也简单,我比较喜欢。

方法4:用Lombok

像这样:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestService {private final UserMapper userMapper;...
}
Lombok生成的代码是这样的:@Service
public class TestService {private final UserMapper userMapper;@Autowiredpublic TestService(final UserMapper userMapper) {this.userMapper = userMapper;}...
}

但如果自己手写成Lombok生成的代码,IDEA依然会给你报警告 。

我猜,应该是IDEA的Lombok插件把IDEA搞懵逼了…所以不提示了…

总结 :这是我目前最喜欢的方式。原因有2:

  • Spring官方并不建议直接在类的field上使用@Autowired注解,原因详见:《Why field injection is evil》 ,用本方法可将field注入编程构造方法注入,Spring是比较推荐的。
  • 体现了Lombok的优势,简化了你的代码。而且你也不用在每个field上都加上@Autowired注解了。

不过这种方式也有缺点:

那就是如果你类之间的依赖关系比较复杂,特别是存在循环依赖(A引用B,B引用A,或者间接的循环引用)时,应用将会启动不起来……

这其实是构造方法注入方式的缺点。

方法5:把IDEA的警告关闭掉

个人没试过,也没有动力去试。没有提示的IDEA是没有灵魂的,我从来不去修改IDEA的任何警告设置。

方法6:安装mybatis plugin

安装mybatis plugin即可解决该问题。

总结

以上是解决问题的6种方法。问题本身其实比较简单,

但其实隐藏的知识点其实挺多的,

例如:

@Autowired和@Resource有什么区别
为什么Spring不建议使用field方式注入
@Repository、@Componnt、@Controller、@Service有什么区别
总之,硬货有时候就隐藏在很low的问题之下,哈哈哈。

参考文档
剔除Intellij中Mybatis的Mapper自动注入警告
idea mybatis 注入 mapper 提示错误

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

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

相关文章

强封锁之后,华为正寻求10亿美元贷款;苹果发布iOS 12.3.1正式版,出击垃圾短信;联想CFO为“联想搬出中国”言论道歉;...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 中芯国际宣布从美国退…

python目前有多少库文件_必学Python库 你知道多少?

Tkinter———— Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块&#xff0c;Tkinter库提供了对Tk API的接口&#xff0c;它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言&#xff0c;用于简化shell下复…

C++中队列的顺序存储

队列引言示例开发环境运行结果引言 队列先进先出&#xff0c;队头出队&#xff0c;队尾入队&#xff0c;其存储可以分为顺序存储和链式储存。本文记录队列的顺序存储。也就是队列中的元素存储的内存空间是连续的&#xff0c;这里使用数组来模拟线性队列。 示例 直接上代码&a…

SpringBoot入门到精通_第1篇 _核心概念

SpringBoot 必知必会 核心精粹 文章目录一、SpringBoot必知必会1. 是什么&#xff1f;能做什么&#xff1f;2. 有哪些特性&#xff1f;一、SpringBoot必知必会 1. 是什么&#xff1f;能做什么&#xff1f; 是什么&#xff1f;能做什么&#xff1f; 是一个快速开发的脚手架 作…

全球再迎超级飓风,黑客可利用微软“蠕虫级”高危漏洞暴击全球

戳蓝字“CSDN云计算”关注我们哦&#xff01;WannaCry 余威未散&#xff0c;一场新的全球性“安全浩劫”接踵而来。“WannaCry”勒索病毒爆发刚满两年&#xff0c;Windows再次被曝出一个“蠕虫级”的高危远程漏洞CVE-2019-0708。攻击者一旦成功利用该漏洞&#xff0c;便可以在目…

.net redis定时_一场由fork引发的超时,让我们重新探讨Redis的抖动问题

​​​​​​​​​​​​​​​​​​​​​​​​​​​​摘要&#xff1a;一次由fork引发的时延抖动问题。背景介绍华为云数据库GaussDB(for Redis) 是一款基于计算存储分离架构&#xff0c;兼容Redis生态的云原生NoSQL数据库&#xff1b;它依靠共享存储池实现了强一致&…

C++中关于树的一些定义

树概念树树的叶子节点节点的度分支结点树的度树的高度树的深度二叉树二叉树的特点满二叉树完全二叉树二叉查找树示例代码实现开发环境运行结果概念 本文以一个简单的树为例&#xff0c;如下图&#xff0c;来记录树的一些概念。 树 一种由n个节点组成的具有一定层次关系的有…

02_Spring Cloud Alibaba整合通用Mapper+Lombok+Mysql

Spring CLoud 整合通用MapperLombokMysql 文章目录一、使用Spring Initializr快速创建Spring Boot应用二、相关依赖2.1. 添加依赖2.2. mybatis添加插件2.3. 在resources目录下面创建generator目录存放generatorConfig.xml2.3.1. config.properties配置文件2.3.2. lombok插件2.3…

如何快速深入理解监控知识? | 技术干货

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;叶左左链接&#xff1a;https://www.jianshu.com/p/5d76d31b39580 监…

bootstrap 模态框无法使用_模态窗 Modal Window - 产品中的??注意力设计

本文是「经典交互模式」系列第二篇&#xff0c;前文回顾&#xff1a;面包屑导航 Breadcrumbs Trail全文目录什么是模态窗 模态窗的使用问题 模态框应用实践 什么是模态窗 Modal Window我们在各种不同的屏幕应用中见过「模态窗」&#xff0c;全屏幕模态窗、弹出信息框、&#xf…

QQmlApplicationEngine failed to load component qrc:/main.qml:-1 No such file or directory

记录qml运行时出现的问题问题描述解决办法问题描述 qml项目编译的时候通过&#xff0c;但是在运行时出现图中所示错误提示。 解决办法 在项目所在的文件夹下删除编译生成的目录&#xff0c;我的项目编译生成目录如下图&#xff1a; 删除编译生成的文件夹后&#xff0c;项目…

SpringBoot +Lombok注解精华篇

SpringBoot 必知必会 核心精粹_注解Lombok 文章目录Lombok注解应用场景DataGetter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCodeTable当数据库的表名和实体类不一致时&#xff0c;name 属性可以指定数据库的表&#xff0c;这样实体类和数据库的表就可以有映…

服务迁移之路 | Spring Cloud向Service Mesh转变 | 技术干货

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a; 李宁转自&#xff1a;博云技术社区Spring Cloud基于Spring Boot开发…

oracle使用关键字做表字段名_ArcGIS SQL使用

本主题将介绍 ArcGIS 中的选择表达式所用的常规查询的各个元素。ArcGIS 中的查询表达式使用常规 SQL 语法。警告&#xff1a;SQL 语法不适用于使用字段计算器计算字段。字段在 SQL 表达式中指定字段时&#xff0c;如果该字段名可能产生岐义(比如与 SQL 保留关键字相同)&#xf…

uml类图浅录

uml类图UML中类图的绘制单个类图的绘制类图中的成员访问属性UML类图中类与类的几种关系关联代码示例解释UML类图表示多重性说明依赖代码示例解释uml类图表示继承示例代码解释UML类图表示实现示例代码解释UML类图表示聚合示例代码UML类图表示组合示例代码解释UML类图表示绘制UML…

技术官网总览

说明连接地址Spring Cloud官网https://spring.io/projects/spring-cloud#learn官网文档https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.htmlSpring Cloud中文官网https://springcloud.cc/spring-cloud-dalston.html 说明连接地址Spring Boot…

python安装spark_python的安装_[老汤]Spark 2.x实战应用系列之Spark开发环境搭建(windows)_大数据系统视频-51CTO学院...

本门课程整理了scala/java/python开发spark应用的本地开发环境的搭建&#xff0c;轻而易举的用各种工具搭建spark开发环境更多的课程可以在51CTO学院中搜索"老汤"播放的时候选择“高清”模式&#xff0c;效果会更好------------------------------------------------…

03_SpringCloud整合Ribbon实现负载均衡

采用随机负载均衡策略&#xff0c;四线服务之间的调用 2个用户中心&#xff0c;1个内容中心&#xff0c;内容中心调用用户中心服务 package com.itmuch.contentcenter.service.impl;import com.itmuch.contentcenter.dao.content.ShareMapper; import com.itmuch.contentcent…

c++构造函数执行顺序

引言 当创建一个类的对象时调用该类的构造函数&#xff1b;若为继承关系的类&#xff0c;则先执行父类的构造函数&#xff0c;再执行子类的构造函数&#xff1b;若为继承关系的类&#xff0c;该类中含有其它类类型的成员变量&#xff0c;那么其构造函数的调用顺序该如何呢。今…

容器精华问答 | 我们为什么需要容器?

戳蓝字“CSDN云计算”关注我们哦&#xff01;容器技术是这两年热门的话题&#xff0c;因为容器技术给我们带来了很多方便的地方&#xff0c;节约了不少成本&#xff0c;不管是在运维还是开发上。今天&#xff0c;就让我们来看看关于容器更加有深度的问题吧。1Q&#xff1a;什么…