Service引入Mapper出错问题

在SpringBoot与MyBatis的整合中,由于@Mapper不是Spring注解,使用@Autowired可能会出现警告。消除警告的方法包括:1) 使用@Resource替代,按名称注入;2) 将@Autowired改为(@Autowired(required=false));3) 修改IDE的检查设置。建议首选使用@Resource注解,因为它能更精确地按名称注入,并避免错误警告的覆盖。

 

@Autowired 自动注入,首先要求被自动注入的类必须在spring容器中注册为bean,,也就是该类必须为@Controller、@Service、@Repository、@Component等注解注释,而springboot-mybatis框架中,我们的持久化层为mybatis的Mapper接口层,一般的我们会在接口层上加注@Mapper注解,或者直接在启动类上加注@MapperScan(basePackages/value=…)注解,而@Mapper和@MapperScan并不是spring框架的注解,所以springboot框架使用@Autowired自动注入mapper接口层时,便会报红色警告,表示可能注入失败。
接下来我们讨论如何消除这样的警告:
1、使用@Resource代替@Autowired注解,根据类型注入改为根据名称注入;
2、将注解@Autowired 改为(@Autowired(required = false)),表示注入时,自动注入的类为非必须;
3、Setting -> Inspections -> 搜索spring bean,找到Spring Bean Autowired,把红色(Error)修改为黄色(Warning);
强烈建议第一种,因为第二种方式修改的范围太广,而且代码也不是很美观,第三中则完全清除了自动注入失败的错误警告,对一些正常的注入失败的警告信息也进行了覆盖,不利于错误排查。
@Autowired 与 @Resource注解的区别:

@Autowired注解来源于spring框架,@Resource注解来源于JSR-250规范;
@Autowired只按照byType 注入;@Resource默认按byName自动注入;
@Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象。需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
原文链接:https://blog.youkuaiyun.com/Wchenchen0/article/details/111685569
还有一种就是在mapper中添加注解@Repository

### 配置 MyBatis 中 `@Mapper` 注解的使用及常见问题解决方法 在 Spring Boot 项目中使用 `@Mapper` 注解时,可能会遇到注入失败、找不到 Bean 或 IDE 报错等问题。以下是常见的原因及解决方案。 #### 添加必要的依赖 Spring Boot 项目中若使用 MyBatis 框架,必须引入正确的依赖库。若未正确配置 MyBatis 的启动器依赖,可能导致 `@Mapper` 注解无法被识别或扫描到。 ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> ``` 该依赖包含 MyBatis 与 Spring Boot 整合所需的自动配置类和注解处理器,确保 `@Mapper` 注解能够正常工作[^2]。 #### 使用 `@MapperScan` 替代 `@Mapper` 如果仅在每个 Mapper 接口上添加 `@Mapper` 注解,而没有配合 `@MapperScan` 指定扫描路径,Spring 容器可能无法找到这些接口并创建对应的代理对象。因此推荐在主应用类或配置类上添加: ```java @SpringBootApplication @MapperScan("com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 该注解会自动扫描指定包下的所有 Mapper 接口,并将其注册为 Spring 容器中的 Bean,避免手动为每个接口添加 `@Mapper`[^4]。 #### 解决 IDEA 中 `@Autowired` 报红问题 即使 `@Mapper` 正确配置,IDEA 可能仍会对 `@Autowired` 注入Mapper 对象提示“可能为 NULL”,从而显示红色警告。这是因为 IDEA 默认对非显式声明为 Spring Bean 的类进行空值检查。虽然实际运行中不会出错,但可以通过以下方式消除警告: - 在 Mapper 接口上添加 `@Component` 注解(不推荐); - 在设置中关闭相关检查:`Settings → Editor → Inspections → Spring → Autowired members must be defined in valid Spring bean (@Component, @Service...)`; - 确保已正确配置 `@MapperScan` 并启用自动扫描功能[^1]。 #### 手动安装 Oracle JDBC 驱动 若项目中涉及 Oracle 数据库连接,还需注意 MyBatis 依赖本身不包含 Oracle JDBC 驱动。需手动下载 `ojdbc6.jar` 并通过 Maven 命令安装到本地仓库: ```bash mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar -Dfile=ojdbc6.jar ``` 并在 `pom.xml` 中添加依赖声明: ```xml <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0</version> </dependency> ``` 缺少驱动会导致数据库连接失败,也可能间接影响 MyBatis 的 Mapper 加载过程[^2]。 #### 验证配置是否生效 启动项目后,可通过日志查看是否成功加载了 Mapper 接口,或者在业务代码中注入 Mapper 并执行简单查询以验证其可用性。例如: ```java @RestController public class UserController { @Autowired private UserMapper userMapper; @GetMapping("/users") public List<User> getAllUsers() { return userMapper.selectList(null); } } ``` 若访问 `/users` 接口返回预期数据,则说明 `@Mapper` 配置正确且接口已被成功代理[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值