【The bean ‘xxxMapper‘ could not be injected because it is a JDK dynamic proxy 报错解决】
The bean 'xxx' could not be injected because it is a JDK dynamic proxy 报错解决
具体报错信息

分析原因
我仔细比较我其他的接口里为什么没有报错,发现我这里用的是 @Resource,而我其他地方用的是 @Autowired , 那么就是@Resource和@Autowired的区别导致的了,@Resource默认按byName注入,@Autowired默认按byType注入。这里不得不提到一个点,就是我的项目里是有一个BgConfigWarehouseMapper和一个BgConfigWarehouseExtMapper,@Resource根据bcConfigWarehouseMapper就找到BcConfigWarehouseMapper,发现和BcConfigWarehouseExtMapper类型对不上,就报了这样的错误,而@Autowire直接根据类型直接就找到了BcConfigWarehouseExtMapper。
@Resource
private BcConfigWarehouseExtMapper bcConfigWarehouseMapper;
@Autowired
private BcConfigWarehouseExtMapper bcConfigWarehouseMapper;
解决办法
- 第一种办法就是改名称,改成和类同名首字母小写
@Resource
private BcConfigWarehouseExtMapper bcConfigWarehouseExtMapper;
- 第二种办法就是@Resource中指定name或者type
1)指定name
@Resource(name = "bcConfigWarehouseExtMapper")
private BcConfigWarehouseExtMapper bcConfigWarehouseMapper;
2)指定type
注意,下面这种方式还是会报错,那么我们已经指定了type为什么还是不行,因为@Resource默认还是先byName,只有当对应的名称不存在对应的bean或BeanDefinition时才会byType(即使你指定了type,也要把name改了)
@Resource(type = BcConfigWarehouseExtMapper.class)
private BcConfigWarehouseExtMapper bcConfigWarehouseMapper;
改成一个匹配不到的name即可:
@Resource(type = BcConfigWarehouseExtMapper.class)
private BcConfigWarehouseExtMapper bcConfigWarehouseMapper2;
@Resource和@Autowired区别
-
@Autowired
由Spring提供,只按照byType注入 -
@Resource
由J2EE提供,默认按照byName自动注入
@Resource不设置任何值时,isDefaultName会为true,默认先走byName的形式,当对应字段名称的bean不存在时走byType;
只指定了type属性时,只有当对应的名称不存在对应的bean时,才会通过byType找到唯一的一个类型匹配的bean;
只指定了name属性,会根据指定的name来获取bean;
既指定了name属性,又指定了type属性,会先根据那么查找对应的bean,然后进行type类型比较