一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 解決Spring使用@MapperScan問題

解決Spring使用@MapperScan問題

2021-12-30 13:44「已注銷」 Java教程

這篇文章主要介紹了解決Spring使用@MapperScan問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

問題場景

今天小編在MyBatis 整合Spring 的時候,使用到了@MapperScan,在啟動期出現了一個錯誤:

Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean()

對于這個錯誤,小編也是倍感無奈,怎么會出現這個錯誤呢,看一下我的依賴有沒有錯誤:

?
1
2
3
4
5
6
7
8
9
10
    compile(project(":spring-context"))
//    compile(project(":spring-instrument"))
    // https://mvnrepository.com/artifact/cglib/cglib
    compile group: 'cglib', name: 'cglib', version: '2.2.2'
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.21'
    // https://mvnrepository.com/artifact/org.mybatis/mybatis
    compile group: 'org.mybatis', name: 'mybatis', version: '3.5.2'
    // https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
    compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.2'

完全沒得毛病呀,他媽的,究竟是哪里出現了問題呢,小編這時將SpringFramework 源碼從github 上clone 下來了,導入idea 開始尋找問題所在。。。

問題根源

經過不懈的努力,小編終于找到了問題根源,在AnnotationsScanner 類中的這個方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static Annotation[] getDeclaredAnnotations(AnnotatedElement source, boolean defensive) {
  boolean cached = false;
  Annotation[] annotations = declaredAnnotationCache.get(source);
  if (annotations != null) {
   cached = true;
  }
  else {
   // 使用@MapperScan 的時候會報錯,引入spring-jdbc 即可
   // 具體原因暫時還不清楚
   // Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean()
   annotations = source.getDeclaredAnnotations();
   if (annotations.length != 0) {
    boolean allIgnored = true;
    for (int i = 0; i < annotations.length; i++) {
     Annotation annotation = annotations[i];
     if (isIgnorable(annotation.annotationType()) ||
       !AttributeMethods.forAnnotationType(annotation.annotationType()).isValid(annotation)) {
      annotations[i] = null;
     }
     else {
      allIgnored = false;
     }
    }
    annotations = (allIgnored ? NO_ANNOTATIONS : annotations);
    if (source instanceof Class || source instanceof Member) {
     declaredAnnotationCache.put(source, annotations);
     cached = true;
    }
   }
  }
  if (!defensive || annotations.length == 0 || !cached) {
   return annotations;
  }
  return annotations.clone();
 }

AnnotatedElement 對于這個類,小編也是不太清楚,這時也倍感無奈,這個方法主要做的事情就是將Appconfig 配置類中的注解掃描下來,那會不會是注解的問題呢,在@MapperScan 注解的注釋中發現小編的代碼與MyBatis-Spring 開發團隊提供的實例代碼一致,這就讓人想不明白了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* <pre class="code">
* &#064;Configuration
* &#064;MapperScan("org.mybatis.spring.sample.mapper")
* public class AppConfig {
*
*   &#064;Bean
*   public DataSource dataSource() {
*     return new EmbeddedDatabaseBuilder().addScript("schema.sql").build();
*   }
*
*   &#064;Bean
*   public DataSourceTransactionManager transactionManager() {
*     return new DataSourceTransactionManager(dataSource());
*   }
*
*   &#064;Bean
*   public SqlSessionFactory sqlSessionFactory() throws Exception {
*     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
*     sessionFactory.setDataSource(dataSource());
*     return sessionFactory.getObject();
*   }
* }
* </pre>

問題追溯

我這個時候被起瘋了都,從GitHub 上由把mybatis-spring 的源碼clone 了下來,導入idea,首先看一下mybatis-spring 的依賴:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dependencies>
   <!-- Compile dependencies -->
   <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>${mybatis.version}</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>${spring.version}</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>${spring.version}</version>
     <scope>provided</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework.batch</groupId>
     <artifactId>spring-batch-infrastructure</artifactId>
     <version>${spring-batch.version}</version>
     <scope>provided</scope>
   </dependency>

從依賴中看到了什么,tmd,<scope>provided</scope>,這個怎么講,太無語了,其中它引入了spring-jdbc 的依賴。想象一下,@MapperScan 注解中是不是也使用到了spring-jdbc 的類,然后在使用@MapperScan 的時候沒有加入spring-jdbc 的依賴,導致注解在掃描期間的錯誤,沒毛病解釋的通,找一下@MapperScan 中是否使用到了spring-jdbc 的依賴。

問題解決

果不其然,下面用一張圖來看吧。

解決Spring使用@MapperScan問題

所以呢,在項目中加入spring-jdbc 完美解決。

SpringBoot  @MapperScan的注意事項

錯誤代碼如下:

[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseSelectProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider] with root cause

檢查@MapperScan導入的包是否為

?
1
import tk.mybatis.spring.annotation.MapperScan;

切記不要導成

?
1
import org.mybatis.spring.annotation.MapperScan

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/zhagnchong480/article/details/111562366

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 亚洲天堂日韩在线 | 精品一区久久 | 欧美日韩国产中文字幕 | 国产成人综合手机在线播放 | 天天黄视频 | 我和老丈洗澡同性 | 亚洲国产成人综合 | 欧美日韩国产亚洲一区二区 | 美女下面被cao出水 美女污视频 | 奇米影视久久777中文字幕 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 操大爷影院| 久久精品视在线观看2 | 窝窝色资源站 | 2012年免费中文视频 | 亚洲va欧美va国产综合久久 | 亚洲欧美优优色在线影院 | 成人免费国产欧美日韩你懂的 | 日朝欧美亚洲精品 | 国产在线视频福利 | ova巨公主催眠1在线观看 | 动漫美女被羞羞产奶 | 欧洲vodafonewi精品 | 波多野结中文字幕在线69视频 | 韩国免费特一级毛片 | 国产自拍资源 | 91尤物在线视频 | tube62hdxxxx日本| 成人性色生活片免费网 | 韩国日本香港毛片免费 | fc2成人免费共享视频 | 91视频破解版 | 污影院 | 亚洲激情欧美 | 国产欧美日韩在线观看精品 | 日韩欧美在线观看综合网另类 | 国产精品资源在线观看网站 | 国产靠逼视频 | 精品无人乱码一区二区三区 | 爱情岛论坛自拍永久入口 | 鄂州一家三口完整版免费 |