开发者社区> 问答> 正文

关于Spring Boot的注解@Mapper和@MapperScan?报错

首先有资料显示这两个注解效果是一样的,只不过@Mapper需要在dao层每一个类上面添加!

问题所在

在启动类上面加注解@MapperScan,没有问题;

但是在dao层方法上面添加@Mapper注解,不加@MapperScan,会报错

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xx.dao.SystemUserDaoI' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

在配置文件mybatis配置如下:

mybatis.configuration.mapUnderscoreToCamelCase=true
mybatis.mapper-locations=classpath*:mapper/*/*.mapper.xml
mybatis.type-aliases-package=com.xx.**

求大佬解答

展开
收起
爱吃鱼的程序员 2020-06-05 14:59:29 3073 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>首先@Mapper及@MapperScan注解是Spring boot Mybatis的注解,并非属于SpringBoot。</p> 
    

     

    然后单独使用@Mapper而不使用@MapperScan是没问题的,如果你的项目出现没有自动声明bean的情况,我看你的截图是分api和service,是否调用的springboot app(api工程)和mapper类声明的接口(service工程)不在同一个工程(jar)内,所以你的Springboot工程在启动时没有扫描到@Mapper类?这是因为mybatis-spring-boot-autoconfigure只在当前运行的springboot app内扫描注解的class,并不会扫描其他依赖的jar包内的class注解。

     

    如果确定是这样的情况,解决办法是:要不你就直接在springboot app使用@MapperScan注解,扫描指定package。要不你就在service工程的启动主类上边添加@SpringBootApplication注解

    如果对你有用,请采纳

     

                            回复 <a class="referer" target="_blank">@Kit_lee</a>  : 了解了,可能真的是这个原因!!回头再研究下,没有深入研究!谢谢回答:smile:
                        
    
                            回复 <a class="referer" target="_blank">@JssDream</a>  : 这样理解,你在子工程B写了一个Service类,用@Service注解了,但在A工程依赖B工程的时候,A工程在启动时,spring并不会自动扫描其他依赖包下边有没有@Service并自动创建Bean实例。Spring只会扫描当前工程下的<a class="referer" target="_blank">@Controller</a>  <a class="referer" target="_blank">@Service</a>  @Componet @Mapper等。所以遇上这程依赖其他子工程的类,需要你用指定扫描的包
                        
    
                            感谢回复!项目结构如下,是多个模块的,service工程没有启动类,只有admin有个启动类,依赖的话也没有问题!!是在不行就只能使用@MapperScan,就是不太理解:flushed:
                        
    
                        @MapperScan必须,@Mapper非必须,可以为接口,也可以是某个包下
                    
    
                            回复 <a class="referer" target="_blank">@Kit_lee</a>  : 对,是可以的,但是那种的好像是单应用,单模块可以,多模块调用好像单独使用@Mapper注解启动一直报注入失败,很尴尬
                        
    
                            @MapperScan并不是必须的,官网上也说了,可以单独使用@Mapper注解每一个Mapper类,也可以使用@MapperScan扫描指定类包。两种方式都可以。
                        
    
                        <h2>SpringBoot整合MyBatis</h2> 
    

    https://springboot.io/t/topic/806

                            感谢回复!项目是多个模块的,pom也添加了相应依赖,使用@MapperScan是没有问题的。可以正常启动,就是在单独使用@Mapper注解会启动报错
                        
    
                        <p><img height="783" src="https://oscimg.oschina.net/oscnet/edb56269c54117b1958609e582097accd1c.jpg" width="376">这是项目的结构图,依赖都加了</p>
                    
    
                            回复 <a class="referer" target="_blank">@Kit_lee</a>  : 感谢回复!!:clap:
                        
    
                            那就是我说的,mybatis-spring-boot-autoconfigure只会扫描当前admin工程内的class注解,不会自动扫描所有依赖包的(范围太大,影响启动性能)。依赖包内的任何注解bean都不会自动创建Bean实例,需要你在admin工程内扫描并创建bean
    
    2020-06-05 14:59:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多