IDEA提示找不到Mapper接口:Could not autowire.No beans of 'xxxMapper' type found

前言

相信大多数互联网公司的持久层框架都是使用 Mybatis 框架,而大家在 Service 层引入自己编写的 Mapper 接口时应该会遇到下面的情况:
在这里插入图片描述
我们可以看到,上面的红色警告在提示我们,找不到 xxxMaper 这个类型的 bean。

为啥呢?

因为 @Mapper 这个注解是 Mybatis 提供的,而 @Autowried 注解是 Spring 提供的,IDEA能理解 Spring 的上下文,但是却和 Mybatis 关联不上。而且我们可以根据 @Autowried 源码看到,默认情况下,@Autowried 要求依赖对象必须存在,那么此时 IDEA 只能给个红色警告了。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;

}

怎么解决?

虽然 IDEA 给了个红色警告,但是程序本身是没问题的,可以正常运行。可是代码里头有红色警告是相当的显眼的,不晓得情况的人还以为我么你的代码有问题呢?

下面我将会列出实践过的解决方案。
1、简单粗暴

直接关掉IDEA的警告提示,是不是很简单?是不是很粗暴?

2、麻烦粗暴,给@Autowried注解设置required=false
@Autowired(required = false)
private CarUserMapper carUserMapper;

这样就不会警告了。因为此时 @Autowried 不会再去校验 Mapper 接口是否为空。
缺点:每引入一个Mapper接口都需要设置上required=false,相当的麻烦,而且容易给别人造成误解:这个Mapper接口真的不需一定存在。

3、@Autowried替换为@Resource
@Resource
private CarUserMapper carUserMapper;

此时也不会给红色警告了。@Resource 注解是 J2EE 提供的,而 @Autowried 注解是 Spring 提供的,他们如果感兴趣可以去看一下他们的区别。

4、在Mapper接口上加@Component
@Mapper
@Component
public inteface CarUserMapper{}

加这个注解呢,主要是为了让欺骗IEDA,让它以为CarUserMapper也是一个Spring管理的Bean,这样子使用@Autowired注解注入也不会报错了。

5、使用构造函数注入(Spring4.x推荐)

相信大家都有使用Lombok这个神器了,我们可以利用他的注解@RequiredArgsConstructor来直接构建构造函数即可,不过我尝试过单单使用@AllArgsConstructor也是没问题的。
当然了,大家如果注入的依赖比较少或者闲得蛋疼,还是可以自己来写构造函数的。

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
//@AllArgsConstructor
public class ChargeServiceImpl implements ChargeService {

    private final RedisTemplate<String, Object> redisTemplate;
    private final CarUserMapper carUserMapper;
    private final ChargingMapper chargingMapper;
}

为什么Spring4.x之后就推荐使用构造函数注入呢?大家可以看看一篇文章:
Why field injection is evil
简单点总结一下就是:可以使依赖不可变、实例化时,会检查构造函数的参数是否为空、方便单元测试等等。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误可能是因为你在使用 @Autowired 注入 Bean 时,Spring 不到合适的 Bean 来进行注入。可能是因为你在使用 @Mapper 注解的类没有在 Spring 的配置文件中进行扫描导致的。请确认是否在 Spring 的配置文件中配置了扫描 mapper 包的语句。 ### 回答2: 当我们在使用Spring框架进行开发时,经常会使用到自动装配(Autowiring)来实现依赖注入(Dependency Injection)。当出现“Could not autowire. No beans of 'xxxx' type found”这个错误提示时,意味着Spring无法到与指定类型相匹配的Bean。 针对该问题,通常有以下几种可能的解决方案: 1. 检查是否正确配置了相关的注解:需要使用`@Mapper`注解对目标类进行标记,以便MyBatis框架能够正确识别并生成Bean实例。确保在类上方正确地添加了该注解。 2. 确认相关的类和接口是否被正确扫描:Spring框架默认会扫描指定包及其子包中的所有类和接口,以便自动装配。请确保目标类所在的包已经被正确地扫描到。可以使用`@ComponentScan`注解来设置扫描路径。 3. 检查Java配置类的正确性:如果使用Java配置类,需要使用`@Configuration`注解标记该类,并确保在配置类中正确地进行了Bean的定义和初始化。检查该配置类是否被正确地加载到应用程序中。 4. 确保相关依赖已经添加到项目中:请检查项目的依赖配置文件(如pom.xml)或相关的构建工具配置文件,确保引入了MyBatis相关的依赖。如果相关依赖未正确添加,可能导致Spring无法到正确的Bean,从而引发该错误。 总结来说,当出现“Could not autowire. No beans of 'xxxx' type found”这个错误时,应该先检查是否正确设置了`@Mapper`注解,然后再确认配置的扫描路径是否正确,同时也要确保相关的依赖已经被正确添加到项目中。通过逐一排查这些问题,应该能够解决这个错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值