SpringBoot项目中添加了@Service然而无法注入Service接口的问题

这篇具有很好参考价值的文章主要介绍了SpringBoot项目中添加了@Service然而无法注入Service接口的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

昨天在项目中使用代码生成器生成了各层面的代码,但是由于未知的原因一直无法调用。经过多方查找后才发现是@MapperScan注解的问题,由于这个藏得比较隐蔽,所以在此记录一下。

问题描述

在接口完成后调用接口,发现无法调用接口,显示错误是

ERROR 1552 --- [nio-8081-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : 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.example.mydemo.service.xxxxxx] with root cause

大致的意思是绑定错误,无法达到映射的意思。无法找到Service包下面的xxxxService实现类。

排查过程

从百度上看,一般可能是mapper绑定失败所致,所以先从排查mapper有关的类和接口甚至文件开始。

  1.  检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;
  2.  检查xml的namespace是否和xml文件的package名称一一对应;
  3.  检查方法名称是否对应;
  4.  检查配置文件里的mapper路径是否正确

但是这里排查了很多遍,都没有发现相关的问题。同事给了我一个方法,测试接口是否确实被注入了。


@Autowired
private ApplicationContext applicationContext;
@GetMapping("test")
public void test(){
    String[] beanNames = applicationContext.getBeanDefinitionNames();
    for (String beanName : beanNames) {
        Object bean = applicationContext.getBean(beanName);
        if (bean instanceof Mapper) {
            // 处理Mapper的Bean实例
            System.out.println(beanName + " is a Mapper bean.");
        }
    }
}

运行后发现,mapper确实注入了。

mapper没有注入到service里,spring boot,后端,java

所以有可能是Service接口和实现类的问题,按照这个思路进行排查。

然后排查到启动类上面,当时的启动类是这么写的

@MapperScan(value = {
        "com.jsb.iot.common",
        "com.jsb.iot.stopcar.parking_lot",
        "com.jsb.iot.stopcar.order"
})
@SpringBootApplication
public class StopCarApplication {

    public static void main(String[] args) {
        SpringApplication.run(StopCarApplication.class, args);
    }

}

试着给类名后面的包名加上dao以缩小扫描范围。

@MapperScan(value = {
        "com.jsb.iot.common",
        "com.jsb.iot.stopcar.parking_lot.dao",
        "com.jsb.iot.stopcar.order.dao"
})
@SpringBootApplication
public class StopCarApplication {

    public static void main(String[] args) {
        SpringApplication.run(StopCarApplication.class, args);
    }

}

发送请求测试,结果测试成功。搜查后发现原因

原因

@Mapper

org.apache.ibatis.annotations.Mapper;

作用:给该注解下面的接口在编译时生成对应的动态代理类并且注入到Spring容器中。

@MapperScan

org.mybatis.spring.annotation.MapperScan;

作用:在启动类上配置,配置的是持久层接口的包的路径。编译后会把路径下所有的接口都生成动态代理类

包下面的所有接口都会实现代理类,这就意味着在之前的写法中,除了impl类被注入了Spring容器中之外,还注入了一个Service的实现类,于是乎在Controller层调用Service时,并没有真正获取被注入的impl类,所以无法调用mapper接口。这种情况只有运行时才会报错。

总结

@MapperScan指定范围下的所有接口,是所有接口,不论是Mapper接口、还是Service接口、或者是其它什么接口,只要接口是在@MapperScan指定的范围内,Mybatis都会对该接口进行对应的代理实现(并将代理实现类注册进容器中)。所以在使用@MapperScan时,一定要注意指定的范围不能过大。

@Mapper和@MapperScan注解以及共存

在排查问题时,偶然遇到@Mapper和@MapperScan注解的共存情况问题,现在把结果附加上去。

  1. 只使用@Mapper注解,不使用@MapperScan注解。会扫描@Mapper注解所在接口,生成动态代理类,注入到Spring容器中。
  2. 只使用@MapperScan注解,不使用@Mapper注解。会扫描@MapperScan注解配置的包下面的接口生成动态代理类,注入到Spring容器中。
  3. @Mapper、@MapperScan注解都使用,使用@Mapper的接口,如果在@MapperScan注解中有配置包路径,那么可以正常使用。
  4. @Mapper、@MapperScan注解都使用,使用@Mapper的接口,如果在@MapperScan注解中没有配置包路径,那么会报错,解决办法,就是在@MapperScan注解中配置正确路径下的包即可。
 参考

 2021120101_@Mapper和@MapperScan注解以及共存_mapperscan和mapper注解-CSDN博客目录1、@Mapper、@MapperScan注解2、报错使用场景1、@Mapper、@MapperScan注解@Mapper注解:使用:直接在接口类上使用,包是:org.apache.ibatis.annotations.Mapper作用:为有此注解的接口生成动态代理类,并且注入到spring容器中。@MapperScan注解:使用:在启动类上配置,配置的是持久层接口的包路径,标注批量生成此包下的接口的动态代理类,并且注入到容器中。2、报错使用场景问题描述:使用_mapperscan和mapper注解https://blog.csdn.net/m0_48983233/article/details/121648122

 @MapperScan与@Mapper_@mapperscan和@mapper-CSDN博客@MapperScan与@Mapper@MapperScan与@Mapper背景说明@MapperScan与@Mapper的作用通过@Mapper让Mybatis对接口提供代理实现通过@MapperScan让Mybatis对接口提供代理实现背景说明我们在编写mapper时,只需要编写接口而不需要对其实现,由Mybatis框架对接口提供对应的代理实现类(,并将代理实现类注册进容器中)。但是Mybatis是怎么知道需要对哪些接口进行代理实现呢,就是通过@MapperScan与@Mappe_@mapperscan和@mapperhttps://blog.csdn.net/justry_deng/article/details/124227444

 SpringBoot中Service实现类添加@Service却任然无法注入的问题 - 简书最近一直在研究Spring Boot。从GitHub上下载了一个my-Blog源码,一边看,一边自己尝试去实现,结果掉在坑了,研究了近一周才爬出来,特地来这博客园记录下来,一...https://www.jianshu.com/p/b72a1ffb3672文章来源地址https://www.toymoban.com/news/detail-786759.html

到了这里,关于SpringBoot项目中添加了@Service然而无法注入Service接口的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于在 springboot 中使用 @Autowired 注解来对 TemplateEngine 进行自动装配时,无法注入的问题。

    本文是基于江南一点雨的 Spring Boot+Vue 系列视频教程第 三 章的第三节,详情参考Spring Boot+Vue系列视频教程 在观看学习这一节时,发现当进行手动渲染 Thymeleaf 模板时,通过 @Autowired 注解来对 TemplateEngine 进行自动装配时,发现 idea 对其显示 No beans of \\\'TemplateEngine \\\' type of found。

    2024年02月02日
    浏览(49)
  • 快速掌握SpringBoot项目中的domain、mapper、service、controller层作用与书写格式

    承接上篇文章:http://t.csdn.cn/49QHB ①四个层负责的功能与作用: 1. Domain:包含业务实体,用于传输和封装数据。作用:作为数据载体,用于在各个模块之间传递业务数据。 2. Mapper:实现Domain与数据库表的映射及数据访问逻辑。作用:负责数据访问,将业务实体与数据库表进行映射,实现

    2024年02月03日
    浏览(47)
  • SpringBoot项目添加WebService服务

    1.简单描述 WebService简单理解就是用http发送接收xml数据,但这个xml得遵守系统的规范。这个规范就是WSDL(Web服务描述语言,Web Services Description Language)。 在WebService中传输的xml有一个正式的名称叫Soap(简单对象访问协议 Simple Object Access Protocol)。 WebService分为客户端和服务端

    2024年02月16日
    浏览(45)
  • springboot项目中添加自定义日志

    或 application.yml文件中的配置 对上述的配置进行说明:

    2024年02月17日
    浏览(44)
  • SpringBoot项目中添加证书授权认证

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在上线的项目中,需要添加一个定时授权的功能,对系统的进行授权认证,当授权过期时提示用户需要更新授权或获取授权,不让用户无限制的使用软件。 在查阅相关资料进行整理后,对该场景做了一

    2024年01月20日
    浏览(39)
  • SpringBoot项目报错:org.springframework.beans.factory.UnsatisfiedDependencyException依赖注入异常(已解决)

           目录 报错信息 可能原因 结论         最近在学Spring Boot,今天在做Spring Boot + Mybatis Plus + Vue项目时启动后端报错:         先看报错信息,说出现了一个 依赖注入异常(UnsatisfiedDependencyException) ,在创建名为 \\\'loginController\\\' 的bean时出错,并且问题出现在字段 \\\'

    2024年02月11日
    浏览(50)
  • SpringBoot+Vue项目添加腾讯云人脸识别

    人脸识别是一种基于人脸特征进行身份认证和识别的技术。它使用计算机视觉和模式识别的方法,通过分析图像或视频中的人脸特征,例如脸部轮廓、眼睛、鼻子、嘴巴等,来验证一个人的身份或识别出他们是谁。 人脸识别可以应用在多个领域,包括安全领域、访问控制系统

    2024年02月11日
    浏览(36)
  • 【IDEA】maven项目添加模块时,webapp没有被标识,无法识别的解决方法

    新添加maven项目模块后,webapp目录未被标识,即没有小蓝点的图标显示。如下图 点击“File”下的“Project Strucure”,在弹出的框中,选中“Modules”下的项目名称,也就是“demo1”,点击“+”号,在弹出框中选择“Web”。 修改“Name”为“webapp”,接下来配置web的路径,上方的

    2024年02月07日
    浏览(63)
  • SpringBoot项目添加2FA双因素身份认证

    双因素身份验证(2FA)是一种安全系统,要求用户提供两种不同的身份验证方式才能访问某个系统或服务。国内普遍做短信验证码这种的用的比较少,不过在国外的网站中使用双因素身份验证的还是很多的。用户通过使用验证器扫描二维码,就能在app上获取登录的动态口令,

    2024年04月25日
    浏览(45)
  • IDEA无法识别SpringBoot项目

    好久没打开的SpringBoot项目,今天打开突然发现IDEA识别不了了,也无法启动,具体如下图:  查了一些资料,具体的原因是:pom.xml没有被maven管理,所以导致无法识别SpringBoot启动类。 解法方法:  1、选中pom.xml,右击,选择add as maven   2、配置SpringBoot的configruations,  选中ad

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包