在IDEA中找不到Mapper報錯
阿新 • • 發佈:2020-12-24
前言
相信大多數網際網路公司的持久層框架都是使用 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 給了個紅色警告,但是程式本身是沒問題的,可以正常執行。可是程式碼裡頭有紅色警告是相當的顯眼的,不曉得情況的人還以為我麼你的程式碼有問題呢?
下面我將會列出實踐過的解決方案。
簡單粗暴
直接關掉IDEA的警告提示,是不是很簡單?是不是很粗暴?
麻煩粗暴,給@Autowried註解設定required=false
@Autowired(required = false)
private CarUserMapper carUserMapper;
這樣就不會警告了。因為此時 @Autowried 不會再去校驗 Mapper 介面是否為空。
缺點:每引入一個Mapper介面都需要設定上required=false,相當的麻煩,而且容易給別人造成誤解:這個Mapper介面真的不需一定存在。
@Autowried替換為@Resource
@Resource
private CarUserMapper carUserMapper;
此時也不會給紅色警告了。@Resource 註解是 J2EE 提供的,而 @Autowried 註解是 Spring 提供的,他們如果感興趣可以去看一下他們的區別。
在Mapper介面上加@Component
@Mapper
@Component
public inteface CarUserMapper{}
加這個註解呢,主要是為了讓欺騙IEDA,讓它以為CarUserMapper也是一個Spring管理的Bean,這樣子使用@Autowired註解注入也不會報錯了。