异常信息如下:

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包运行

 

posted on 2021-03-31 13:25  你不知道的浪漫  阅读(455)  评论(0编辑  收藏  举报