报错信息

  1. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.xx.idata.develop.dal.dao.job.DevJobInfoMyDao.selectJobInfoExecuteDetail
  2. at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
  3. at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
  4. at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:107)
  5. at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
  6. at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94)
  7. at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
  8. at com.sun.proxy.$Proxy149.selectJobInfoExecuteDetail(Unknown Source)
  9. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  10. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  11. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  12. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  13. at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
  14. at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
  15. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  16. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
  17. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  18. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
  19. at com.sun.proxy.$Proxy150.selectJobInfoExecuteDetail(Unknown Source)
  20. at cn.zhengcaiyun.idata.develop.service.job.impl.JobInfoServiceImpl.getJobInfoExecuteDetail(JobInfoServiceImpl.java:365)
  21. at cn.zhengcaiyun.idata.develop.service.job.impl.JobInfoServiceImpl$$FastClassBySpringCGLIB$$676509e8.invoke(<generated>)
  22. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
  23. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
  24. at cn.zhengcaiyun.idata.develop.service.job.impl.JobInfoServiceImpl$$EnhancerBySpringCGLIB$$d97bd4f2.getJobInfoExecuteDetail(<generated>)
  25. at cn.zhengcaiyun.idata.portal.controller.dev.job.JobInfoController.getJobInfoDetail(JobInfoController.java:166)
  26. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  27. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  28. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  29. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  30. at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
  31. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
  32. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
  33. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
  34. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
  35. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
  36. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
  37. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
  38. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
  39. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
  40. at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
  41. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
  42. at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
  43. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  44. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  45. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
  46. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  47. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  48. at cn.zhengcaiyun.idata.portal.config.WebAuthFilter.doFilter(WebAuthFilter.java:161)
  49. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  50. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  51. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
  52. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
  53. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  54. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  55. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
  56. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
  57. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  58. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  59. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
  60. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
  61. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  62. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  63. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
  64. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
  65. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
  66. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
  67. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
  68. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
  69. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
  70. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
  71. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
  72. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
  73. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
  74. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  75. at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
  76. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
  77. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  78. at java.base/java.lang.Thread.run(Thread.java:834)

解决办法总结

  1. 检查target目录下是否存在.xml文件
  2. 检查xml的mapper``namespace指向的全量限定符是否正确(和对应的Dao的class全量限定符是否一样)
  3. 检查对应的Dao文件是否定义了此方法
  4. 检查application.yamlmybatis.mapper-locations的配置是否正确,是否能匹配到xml文件
  5. 如果是多模块配置xml文件,检查mybatis.mapper-locations是否是classpath*而不是classpath

我的排查过程

按网上搜索到的解决办法,除了第5点,前4点都试过了都不行,于是根据报错信息栈跟源码,从最后一步开始debug。
MapperMethod#SqlCommand
image.png
�MapperMethod#resolveMappedStatement
image.png
Debug看下数据信息,MappedStatement中未包含statementId
image.png
image.png
再往上找MappedStatement的数据装载代码,该类是sqlSession.getConfiguration().mappedStatements

最后找到:
PathMatchingResourcePatternResolver#getResources
image.png