wayn111 / mybatis-xmlreload-spring-boot-starter

mybatis-xmlreload-spring-boot-starter 支持xml文件热更新
Apache License 2.0
57 stars 19 forks source link

修复mapper-locations配置为根路径时,文件修改后热加载失败的问题 #5

Closed zhfeng1 closed 9 months ago

zhfeng1 commented 10 months ago

修复mapper-locations配置为项目根路径时,同时扫描到target和/src/main/resources下的同一个Mapper,导致mapperLocations中存在两个相同的Mapper路径,继而文件修改后热加载失败的问题

zhfeng1 commented 10 months ago

您好,我遇到了一个问题,如题所示。最终报错是找不到MappedStatement。猜测问题点应该是两个一样的xml,第一次重新加载时loadedResources清空了,但是第二次重新加载是loadedResources中已经有这个xml了,所以xmlMapperBuilder::parse方法中就没有重新放到Configuration中。

wayn111 commented 10 months ago

有完整的异常堆栈信息吗,是在本地还是在服务器上

zhfeng1 commented 10 months ago

是在本地遇到的。下面是堆栈,数据已脱敏,日志中也可以看到有两条:mapperLocation reload success:xxx,但只有一条mybatis xml file has changed

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx.service.dao.XxxMapper.xxx
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
    at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:108)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:35)
    at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:95)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
    at com.sun.proxy.$Proxy198.xxx(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
    at com.sun.proxy.$Proxy199.xxx(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.hotswap.agent.plugin.spring.getbean.HotswapSpringInvocationHandler.doInvoke(HotswapSpringInvocationHandler.java:69)
    at org.hotswap.agent.plugin.spring.getbean.HotswapSpringInvocationHandler.invoke(HotswapSpringInvocationHandler.java:64)
    at com.sun.proxy.$Proxy200.xxx(Unknown Source)
    at xxx.service.service.impl.Xxx.xxx(Xxx.java:1013)
    at xxx.service.service.impl.Xxx$$FastClassBySpringCGLIB$$58a96ed.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
    at xxx.service.service.impl.Xxx$$EnhancerBySpringCGLIB$$1da9e4f8.xxx(<generated>)
    at xxx.service.service.impl.Xxx$HOTSWAPAGENT_$$FastClassBySpringCGLIB$$58a96ed.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at HotswapSpringCallback_1796692748.intercept(HotswapSpringCallback_1796692748.java)
    at xxx.service.service.impl.Xxx$HOTSWAPAGENT_$$EnhancerBySpringCGLIB$$2bc0cc78_3.xxx(<generated>)
    at xxx.service.web.back.rest.Xxx.xxx(AccessAllDataController.java:200)
    at xxx.service.web.back.rest.Xxx$$FastClassBySpringCGLIB$$2051bfbe_2.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
wayn111 commented 10 months ago

加我微信waynaqua我给你远程看看吧,这个堆栈看不出来。