NoUniqueBeanDefinitionException: expected single matching bean but found 2

文章目录


前言

看到这个错误,大致也能猜出错误的原因,就是spring中注入的bean重复了,本来应该是单利的bean,但是现在却找到了两个,那么导致这个问题的原因是什么?如何解决呢?


一、错误现象

运行项目或者运行junit测试,直接报错,抛出错误的位置:

错误控制台日志:


二、原因分析

其实产生这种错误的原因有以下三种:

  • 1 手欠

例如: 你有 A B 两个service ,都要注入,但是你注入的时候,手欠的加入了注入的名字, A B 都注入为了 a,就会抛出如上错误;

  • 2 同一个类被多次扫描,且扫描结果不一致

例如: 我今天遇到的这个错误就是,两次扫描,两次扫描key不一致,一次是类,一次是类全路径名,但是都放入了spring中,抛出如上错误;

复制代码
@Nullable
	public Object resolveNotUnique(ResolvableType type, Map<String, Object> matchingBeans) throws BeansException {
		throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet());
	}

正常来说这段代码, matchingBeans.keySet() 的长度应该为1 ,但是我找到了两个;

  • 3 虽然不是手欠,但是仍然是第一个错误

有两个名为A 的bean,但是包不同, com.ceshi.A 和 com.ce.shi.A,但是注入的时候,都为 a;


三、解决办法

其实第一种和第三种,都比较解决;

第一种: 别手欠

第三种: 起不同名字,或者注入不同的名字
第二种:

其实这种是由于编码不规范,或者任意增加包扫描导致的错误,造成了两次扫描;例如 com.ceshi.A

第一次扫描: SpringBootApplication 默认就会扫描包下所有要注入的bean,此时扫描到的bean名称,在不自定义的情况下,就为 a;

第一次扫描: 自己自定义了一个扫描类,且开启了一个东西
nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class

它会导致你扫描的所有bean都变为了全路径bean名称,就为 com.ceshi.A

至此,发现了此问题的原因,那么解决办法就是,在原有的启动类上,也加入这个开启全路径名称bean 的注入;


总结

那么为什么他会自定义了一个包扫描,且开启了nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class呢?

其实不怪他:

因为这个项目要引入很多自定的jar包,jar包中就是有与目前同名的bean要注入,但是包路径不同,为了都可以注入成功,所以最终也只能采用此办法,相当于全局都开启了这个 配置;

这个问题,百度了半个多小时也没有解决,虽然这篇文字写的不多,但是我相信一定可以派上大用场,貌似目前还没有解决这个问题的办法,以及原因分析;
字少事儿大原则~~

相关推荐
lingggggaaaa11 分钟前
小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇&数据库篇&MySQL&MSSQL&Oracle&自动化项目
java·数据库·windows·笔记·学习·安全·网络安全
迦蓝叶40 分钟前
JAiRouter v1.0.0 正式发布:企业级 AI 服务网关的开源解决方案
java·运维·人工智能·网关·spring·ai·开源
安卓开发者1 小时前
鸿蒙NEXT应用接入快捷栏:一键直达,提升用户体验
java·harmonyos·ux
yudiandian20141 小时前
03 Eclipse 配置 JDK 环境
java·ide·eclipse
_码力全开_1 小时前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
陈一Tender1 小时前
JavaWeb后端实战(登录认证 & 令牌技术 & 拦截器 & 过滤器)
java·开发语言·spring boot·mysql
Camel卡蒙1 小时前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
孤廖1 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我123451 小时前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime