异常信息如下:
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包运行
本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。