SpringBoot项目下的mapper接口代理类无法注入Spring容器的Bug
准备做一个SpringCloud的测试,我随手建立了一个SpringBoot子工程,但是一下子Bug就出来了,找了1下午+1晚上的Bug,终于在晚上9.33解决了问题。话不多说,看代码首先是遇到的Bug:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request
话不多说,看代码
首先是遇到的Bug:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.kk.service.DeptService.get1] with root cause
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.kk.service.DeptService.get1
1.寻常配置却访问异常?
首先看到Invalid bound statement (not found):我以为的mapper.xml的映射文件找不到没有加载到target目录中,于是修改了maven的一些配置,重跑项目,发现映射文件已经有了,但是访问页面仍然还是这个错误。
2.映射文件已存在? Sql语句没问题
排除了映射文件的不存在,我开始想是不是映射文件与中select语句的结果不匹配,无法映射到实体类中,但是看了又改了半天,发现自己并没有错,只不过是resultMap与实体类和数据库字段的对应,又排除这一问题。
3.又见警告
我开始一点一点的查找,发现一个少见警告:
Could not autowire. No beans of ‘DeptMapper’ type found.
Inspection info:Checks autowiring problems in a bean class.
起初没太注意,但是越看越不对劲,Bean没有被注册?
于是我开始一步一步的排查,从controller层到service层再到dao层,发现controller层可以拿到service层的实现类,但是方法调用进入到service层之后,报错就出来了,这正好也是之前警告在的位置,显而易见,service层通过Autowire获取mapper时出错了,难道是mapper没有注册到Spring中?但是我加了@Mapper注解了啊。
4.原因所在
终于,又经过一系列的测试,发现@Mapper的确将我们写的接口成功注入到了Spring容器中,但是service层通过Autowire获取的是mapper的实现类,而实现类是Mybatis通过动态代理动态生成的,而问题的关键就在于动态代理类并没有注入到Spring中,所以service层拿不到,而我们需要加上@MapperScan(“com.xx.mapper”)注解,此注解是在Mybatis包下的,他是Mybatis的扫描包,现在只需要把@MapperScan加到SpringBoot的启动类上或者其他Spring能扫描到的包下面即可,作用就是让Spring去扫描Mybatis动态代理类加载到容器中,大功告成,发量-999。
更多推荐
所有评论(0)