使用SpringBoot devtools热部署功能,Mybatis出现无法找到映射文件的错误提示,导致无法启动web服务器
错误提示:
Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [mapper/]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1363) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1023) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
at org.springframework.core.io.ClassPathResource.resolveURL(ClassPathResource.java:155) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:193) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:497) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:298) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.mybatis.spring.boot.autoconfigure.MybatisProperties.getResources(MybatisProperties.java:191) ~[mybatis-spring-boot-autoconfigure-2.0.0.jar:2.0.0]
at org.mybatis.spring.boot.autoconfigure.MybatisProperties.lambda$resolveMapperLocations$0(MybatisProperties.java:185) ~[mybatis-spring-boot-autoconfigure-2.0.0.jar:2.0.0]
问题原因:
关键字不能加载[mapper/]。
springBoot 使用了spring-boot-devtools,热部署后加载mybatis映射文件找不到对应目录造成的
两个解决方法:
第一个禁用热加载
pom.xml里面的这个可以不改
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
application.properties配置对应属性为false
spring.devtools.restart.enabled=false
第二个解决方法为
只需要设application.properties
mybatis.mapperLocations=classpath*:mapper/*.xml
使用classpath*:替换之前的classpath:来告诉spring查找所有classpath