zoukankan      html  css  js  c++  java
  • 记录一次通用Mapper+自定义mapper出现的问题分析以及排查

    首先看配置

    1、这是pom文件依赖

     <!-- mybatis配置 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
    
            <!-- 通用mapper逆向工具 -->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>2.1.5</version>
            </dependency>

    2、这是yml文件的配置

    ##########
    # mybatis 配置
    ##########
    mybatis:
      type-aliases-package: com.liaoyuanping.pojo               # 所有POJO类所在包路径
      mapper-locations: classpath:mappers/*.xml                 # mapper映射文件
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    ################
    # mybatis mapper 配置
    ################
    # 通用 Mapper 配置
    mapper:
      mappers: com.liaoyuanping.my.mapper.MyMapper
      not-empty: false    # 在进行数据库操作的的时候,判断表达式 username != null, 是否追加 username != ''
      identity: MYSQL

    3、启动类添加相关扫描

    @SpringBootApplication
    //扫描 mybatis 通用mapper 所在的包
    @MapperScan(basePackages = "com.liaoyuanping.mapper")
    //扫描所有包以及相关组件包
    @ComponentScan(basePackages = {"com.liaoyuanping", "org.n3r.idworker"})
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    4、检查先根据下面的问题一一排查

    前提,写完后端方法后,在自己测试接口方法的时候,提示Integer跟String转换异常,经过排查发现是VO类的fatherId用错了类型,改动以后,重新install,又Build以后,出现了下面无法获取这个类下的方法,如下问题1,说明是配置出了问题,因为连方法测试都不正常

     问题1:测试接口获取父级下的二三级分类,出现异常 nvalid bound statement (not found)

        提示找不到该方法而出现的BindException,同时在启动日志看到了 Property'MapperLocations'was not specified

     分析:排除上面的那些常见出现问题后,还是报该错误,一开始以为是Resources下的资源文件有问题,然后查看一些对应的配置文件,发现也没有错误,就进行build以及

        重新把这个Mapper接口以及对应的XML文件删除重写,然后发现还是不行,在target目录下也发现有打包到对应的XML文件,然后查了查资料,分析会不会是XML打

        包了,但是并没有映射到对应的Maper接口呢,就修改为classpath:resources/mapper/*.xml,然后发现还是不行,又添加<Build>指引resources目录下的文件添加进

           install,发现还是报该错误,然后经过重复的打包,以及build,可能出现了新的一些变动,导致出现了新的错误(这个问题不知道如何出现的),如下问题2

     问题2:install以后,运行的时候提示这个Controller类下的对应的一系列嵌套方法有问题,提示target目录下的UsersMapper.xml是出现了

    IllegalArgumentException错误,无法解析这个UsersMapper.xml文件
    Error creating bean with name 'indexontroller': Unsatisfied dependency expressed through field 'carouselService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'carouselServiceImpl': Unsatisfied dependency expressed through field 'carouselMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'carouselMapper' defined in file [F:JavaProjectstate_onestate_one-mapper	argetclassescomliaoyuanpingmapperCarouselMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [tk/mybatis/mapper/autoconfigure/MapperAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [F:JavaProjectstate_onestate_one-mapper	argetclassesmappersUsersMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'file [F:JavaProjectstate_onestate_one-mapper	argetclassesmappersUsersMapper.xml]'. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.liaoyuanping.mapper.UsersMapper.BaseResultMap
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)

     分析:因为是通用Mapper,而且直接使用的是逆向工程生成的POJO类跟mapper接口以及对应的Mapper.xml,而且在生成完以后的方法也是可以实现的,是没有错误的。

               首先排除生成的过程以及最终生成的数据类有错误这个方向。打开一看发现不知道什么时候多了一段ResultMap的配置,因为生成的时候是只有上面这一个ResultMap的

          并且id 都是为 "BaseResultMap",所以我推测可能是之前的install或者build project的时候,通用mapper二次生成配置了一些东西,因为我根本没改过这个XML的配置

     解决:最后把下面这个不知道什么时候多出来的ResultMap删除掉,重新install,然后重新运行,通用Mapper下的方法都可以正常执行,自定义Mapper接口的方法又重复出现了问题1那样无法获取该方法的类型,在很诧异之余,重新检查相关配置,然后发现yml文件的路径指定没改回来,改回来以后执行正常

     最后启动正常,控制台也正常输出,没有报异常或者警告,测试自定义接口方法也正常返回数据(为了方便,直接使用swagger测试)

     

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/liaoyuanping-24/p/14071494.html
Copyright © 2011-2022 走看看