纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Spring使用@MapperScan 解决Spring使用@MapperScan问题

「已注销」   2021-09-14 我要评论
想了解解决Spring使用@MapperScan问题的相关内容吗「已注销」在本文为您仔细讲解Spring使用@MapperScan的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Spring使用,Spring,@MapperScan下面大家一起来学习吧

问题场景

今天小编在MyBatis 整合Spring 的时候使用到了@MapperScan在启动期出现了一个错误:

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

对于这个错误小编也是倍感无奈怎么会出现这个错误呢看一下我的依赖有没有错误:

    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 类中的这个方法:

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 开发团队提供的实例代码一致这就让人想不明白了:

 * <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 的依赖:

 <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-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导入的包是否为

import tk.mybatis.spring.annotation.MapperScan;

切记不要导成

import org.mybatis.spring.annotation.MapperScan

以上为个人经验希望能给大家一个参考也希望大家多多支持


相关文章

猜您喜欢

  • Vue.js之render函数 Vue.js之render函数使用详解

    想了解Vue.js之render函数使用详解的相关内容吗猫老板的豆在本文为您仔细讲解Vue.js之render函数的相关知识和一些Code实例欢迎阅读和指正我们先划重点:vue.js,render,vue.js,render详解下面大家一起来学习吧..
  • npm 多个包源加载包 npm设置同时从多个包源加载包的方法

    想了解npm设置同时从多个包源加载包的方法的相关内容吗chenxin.dm在本文为您仔细讲解npm 多个包源加载包的相关知识和一些Code实例欢迎阅读和指正我们先划重点:npm,多个包源加载包,npm,包源下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式