zoukankan      html  css  js  c++  java
  • mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from previous mappers already contains value for

    异常信息如下:

    on: Error parsing Mapper XML. The XML location is 'URL [jar:file:/F:/project/java/devman-jdk11/customer-manager/target/customer-manager-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/mapper/CustomerMapper.xml]'. Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers already contains value for com.h2.mes.customer.mapper.CustomerMapper.baseQueryListxxxxxx
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
            at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
            at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
            at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
            at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897)
            at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
            at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
            at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
            at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
            at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:405)
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
            at com.h2.mes.customer.CustomerApplication.main(CustomerApplication.java:33)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:566)
            at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
            at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)
            at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
            at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customerServiceImpl': Unsatisfied dependency expressed through field 

    笔者最近使用springcloud进行微服务项目开发(为了节省公司硬件资源,此种模块应用合理性不佳)。

    其中一个模块platform-common里面有以下目录结构的代码

     另外一个模块customer-manager引用了platform-common,maven依赖如下:

     <dependency>
        <groupId>com.h2.device</groupId>
        <artifactId>platform-common</artifactId>
        <version>${project.version}</version>
     </dependency>

    customer-manager中使用了数据库访问功能,使用的三方库mybatis-plus3.4.2,属性文件配置如下:

     其中mapper-locations配置是错误的。在idea中调试的时候不会报错,能正确的应用DictMapper,DictItemMapper相关dao,编译成jar包运行就报

    以上异常。

    究其原因,笔者找到了相关代码

    package com.baomidou.mybatisplus.autoconfigure;
    public class MybatisPlusAutoConfiguration implements InitializingBean {

    @SuppressWarnings(
    "SpringJavaInjectionPointsAutowiringInspection") @Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { .... #188行 Resource[] mapperLocations = this.properties.resolveMapperLocations(); .... }
    }

    配置为

    mapper-locations: ["classpath:mapper/*.xml","classpath*:mapper/*.xml","classpath*:**/mapper/*.xml"]

    idea调试返回的Resource数组内容

     jar方式运行,返回的Resource数组内容

     mybatis3.5.6相关解析配置文件代码段

    package org.apache.ibatis.builder.xml;
    
    public class XMLMapperBuilder extends BaseBuilder {
    
    #93行
      public void parse() {
        if (!configuration.isResourceLoaded(resource)) {
          configurationElement(parser.evalNode("/mapper"));
          configuration.addLoadedResource(resource);
          bindMapperForNamespace();
        }
    
        parsePendingResultMaps();
        parsePendingCacheRefs();
        parsePendingStatements();
      }
    
    }

    其中class path resource mapper/customerMapper.xml和后面的jar!/BOOT-INF/classes!/mapper/CustomerMapper.xml是等价的,所以代码走到

    XMLMapperBuilder93行的时候再次加载报以上错误。

    解决方法

    修改mapper-locations为以下内容

    mapper-locations: "classpath*:mapper/*.xml"

    再次运行代码,分别如下:

    idea调试:

     jar包运行

    本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
    创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
  • 相关阅读:
    【机器学习】算法原理详细推导与实现(一):线性回归
    《0~3岁孩子的 正面管教》——备忘
    马歇尔·卢森堡《非暴力沟通》——备忘
    李笑来《财富自由之路》——备忘
    select、poll、epoll之间的区别总结[整理]
    堆和栈区别
    Linux 文件系统剖析
    Inside The C++ Object Model(五)
    Inside The C++ Object Model(四)
    Inside The C++ Object Model(三)
  • 原文地址:https://www.cnblogs.com/passedbylove/p/14601032.html
Copyright © 2011-2022 走看看