0
点赞
收藏
分享

微信扫一扫

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr

异常信息如下:

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里面有以下目录结构的代码

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_mybatis

 

 

 另外一个模块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,属性文件配置如下:

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_java_02

 

 

 其中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数组内容

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_spring_03

 

 

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

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_xml_04

 

 

 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调试:

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_mybatis_05

 

 jar包运行

mybatis/tkmybatis/mybatis-plus中mapper-locations配置错误导致的XML fragments parsed from pr_xml_06

 

举报

相关推荐

0 条评论