【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类型比较