相信大家在使用 idea 的时候一定会遇到这样的问题,就是在 service 里注入 mapper 的时候,明明代码没有问题,也可以运行,但是 idea 它就是给你报个错,有个红色的波浪线在下面,这让人感觉很不舒服。怎么办呢?

先来大概说一下,产生这种现象的原因。idea 其实是非常智能的,它可以理解 Spring 的上下文,然鹅 XxxxMapper 这种接口是 Mybatis 的,IDEA 它理解不了。再加上 @Autowired 这个注解呢,它默认情况下要求依赖对象(也就是 XxxxMapper )必须存在,而 IDEA 认为这个对象的实例 / 代理是个 null,所以就友好地给个提示,给你报个红~

今天就说一下以下几种解决方案

方法 1:为 @Autowired 注解设置 required = false

使用 @Autowired 注解时,若希望允许 null 值,可设置 required = false

像这样:

这样就不会有警告了。原因很好理解:IDEA 认为 cashTicketMapper 是个 null,给了警告;加上 required = false 后,使用 @Autowired 注解不再去校验 userMapper 是否存在了,也就不会有警告了。

但是,这种方式有点蛋疼!一个庞大的既有项目,可能到处都在引用 Mapper,总不能到处都补上 required = false 吧。而且对于新手 / 新员工,很难一眼看懂加 required = false 属性只是为了解决 IDEA 的警告。

方法 2:用 @Resource 替换 @Autowired

像这样:

这样也不会再有讨厌的警告。如果你对原因感兴趣,不妨去了解一下 @Autowired 与 @Resource 的区别

这种方式挺赞,但如果一个项目已经大量使用 @Autowired,然后为了个警告到处改成 @Resource,也有点蛋疼。

方法 3:在 Mapper 接口上加上 @Repository 注解

像这样:

这样也能让你的

@Autowired private CashTicketMapper cashTicketMapper; 不再报错。

当然,如果你用 @Component 替换 @Repository 也是可以的。原理大致:IDEA 不是认为 userMapper 是个 null…

加个 @Repository 注解或者 @Component 骗一下 IDEA 就 OK 了……

这种方式也比较赞,改动小,也简单,我比较喜欢。

方法 4:用 Lombok

像这样:

Lombok 生成的代码是这样的:

@Service
public class TestService {
    private CashTicketMapper cashTicketMapper;
    @Autowired
    public TestService(CashTicketMapper cashTicketMapper;) {
        this.cashTicketMapper= cashTicketMapper;
    }
}

但如果自己手写成 Lombok 生成的代码,IDEA 依然会给你报警告 。我猜,应该是 IDEA 的 Lombok 插件把 IDEA 搞懵逼了… 所以不提示了…

方法 5:把 IDEA 的警告关闭掉

这个方法比较不推荐,感觉没有提示的 IDEA 是没有灵魂的,所以不推荐。我也从来不去修改 IDEA 的任何警告设置。

但是大家可以按照下图去试试

好了,以上就是 idea 注入 mapper 报错报红的几种解决方案,希望对你有所帮助~