SpringCloudAlibaba----Nacos

本文详细介绍了Nacos的核心功能,包括服务发现、配置管理和健康监测,以及如何使用Nacos进行服务注册与发现。文章还涵盖了Nacos的安装步骤,配置中心的使用,配置项的热更新和灰度发布,以及集群环境的部署。此外,讨论了Nacos的健康检查机制和一致性协议,特别是Distro协议的工作原理。


注意:博主当前使用的最新版2.2.2,随着时间变化博主使用的版本会落后

一.Nacos简介

1.Nacos(Dynamic Naming and Configuration Service):是个易于构建云原生应用的动态服务发现、配置管理和服务管理平台

2.Nacos 致力于发现、配置和管理微服务,快速实现动态服务发现、服务配置、服务元数据及流量管理

3.服务(Service)是 Nacos 世界的一等公民,支持几乎所有主流类型“服务”的发现、配置和管理、其中包括:

  • Kubernetes Service
  • gRPC Service
  • Dubbo RPC Service
  • Spring Cloud RESTful Service

4.Github项目: https://github.com/alibaba/nacos

5.官方站点:https://nacos.io/zh-cn/

二.Nacos 的关键特性

1.服务发现和服务健康监测:nacos作为服务注册中心可用于服务发现,并支持传输层(TCP)和应用层(HTTP)的健康检查,并提供了agent上报和nacos server端主动探测两种模式,另外还有统一的Dash Board。

2.动态配置中心:nacos可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置,消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷

3.动态 DNS 服务:nacos支持内网的简单DNS解析服务,以及以 DNS 协议为基础的服务发现

4.服务及其元数据管理:nacos能管理数据中心的所有服务及元数据,包括:服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务SLA 以及 metrics 统计数据

三.nacos相关图

1.架构图
在这里插入图片描述
2.数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
在这里插入图片描述
2.1名词解释

Namespace:命名空间,公共的命名空间师public
Group:分组,默认分组是DEFAULT_GROUP
Service:服务名称
DataId:配置文件名称

四.Nacos的安装

1.下载地址:https://github.com/alibaba/nacos/releases/tag/2.2.2
在这里插入图片描述
2.上传到自己的服务器中需要开放如下端口:8848,9848,9849

3.解压:tar zxvf nacos-server-2.2.2.tar.gz
在这里插入图片描述
4.在mysql中创建一个名为nacos的库,并且将nacos提供的sql进行执行
在这里插入图片描述
sql执行后应该有如下表
在这里插入图片描述
5.配置mysql的信息,配置文件信息在conf目录下的application.properties中
在这里插入图片描述
6.在application.properties开启授权
在这里插入图片描述
7.设置密钥为:SecretKey012345678901234567890123456789012345678901234567890123456789
在这里插入图片描述
8.设置请求名称
在这里插入图片描述

9.设置好后进行保存

10.进入nacos/bin目录进行启动

nacos默认为集群启动,所我在启动时需要加参数

启动命令:sh startup.sh -m standalone

如果想用sh startup.sh直接启动单机版,将cluster改为standalone后即可
在这里插入图片描述

11访问页面:

地址为:服务器ip:8848/nacos
用户名:nacos
密码:nacos
在这里插入图片描述

五.使用Nacos完成服务注册与发现

1.参考官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html

2.版本说明文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

3.博主采用的版本为下图红色标出
springboot2.6.13这个版本中nacos注册不上去,博主还在研究源码ing

在这里插入图片描述

4.创建工程Andy-parent, Andy-api,Andy-driver,Andy-order

Andy-parent:为父工程
Andy-api:为公公共模块
Andy-driver:司机模块
Andy-order:订单模块
在这里插入图片描述

5.在Andy-paren工程添加如下坐标

<!--SpringBoot版本-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.11</version>
</parent>
<properties>
    <spring.cloud.version>2021.0.4</spring.cloud.version>
    <spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

6.在Andy-api工程添加如下坐标

<!--web包-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- nacos -->
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
 <!--bootstrap-->
   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>

7.在Andy-driver,Andy-order分别创建bootstrap.yml文件,并且添加如下配置

  • Andy-driver
server:
  port: 18081   # tomcat端口
spring:
  application:
    name: Andy-driver  #服务名称
  cloud:
    bootstrap:
      enabled: true  #开启bootstrap加载
    nacos:
      discovery:
        server-addr: 192.168.44.128:8848                     #nacos地址
        namespace: e466f8d6-6abd-4037-b3c4-add3ec61d003      #nacos命名空间
        username: nacos										 #nacos用户名
        password: nacos                                      #nacos密码
  • Andy-order
server:
  port: 18082    # tomcat端口
spring:
  application:
    name: Andy-order    #服务名称
  cloud:
    bootstrap:
      enabled: true    #开启bootstrap加载
    nacos:
      discovery:
        server-addr: 192.168.44.128:8848                    #nacos地址
        namespace: e466f8d6-6abd-4037-b3c4-add3ec61d003     #nacos命名空间
        username: nacos                                     #nacos密码
        password: nacos                                     #nacos密码

7.在Andy-driver工程,Andy-order工程的启动类上加上@EnableDiscoveryClient注解
在这里插入图片描述
在这里插入图片描述
8.启动后我们可以看见nacos中有如下两个服务
在这里插入图片描述

六.使用Nacos作为配置中心

1.在Andy-api模块中添加如下坐标

<dependency>
   <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.分别在Andy-driver工程下的bootstrap.yml文件添加如下配置

spring:
 cloud:
   nacos:
     config:
       server-addr: 192.168.44.128:8848                    #nacos地址
       namespace: e466f8d6-6abd-4037-b3c4-add3ec61d003     #nacos命名空间
       username: nacos                                     #nacos密码
       password: nacos                                     #nacos密码

3.在nacos中创建配置
dataId组成部分为:${prefix}-${spring.profiles.active}.${file-extension}

假设添加一个一个数据库连接的配置
在这里插入图片描述

在这里插入图片描述
4.启动项目,不报错就表示成功

5.多环境配置

  • 配置文件的克隆 (这里克隆一个Andy-driver-dev.yml)
  • 在Andy-driver工程中的bootstrap.yml文件中添加以下配置
spring:
	profiles:
		active: dev

6.启动项目,没报错就成功了

七.Nacos配置项热更新

1.外部配置中心配置项发生变化时,应用端在无需重启应用的情况下能自动同步最新配置数据。

在这里插入图片描述
2.Environment 热更新

  • Environment代表了应用的运行时环境,其中包括了profiles 和 properties,而properties属性可能来源于properties文件、JVM properties、system环境变量等等
  • nacos配置变更后,environment对象中能自动同步变更的数据,可通过其String getProperty(String key);获取

在这里插入图片描述
3.@ConfigurationProperties 热更新

  • ConfigurationProperties注解的作用是用于获取配置文件中的配置项并绑定到bean的属性上
  • nacos配置变更后,ConfigurationProperties所标注bean的属性能自动刷新值
    在这里插入图片描述
    4.@Value + @RefreshScope热更新
  • Value注解也是可以将指定的配置项绑定到bean的属性上
  • nacos配置变更后,Value标注的属性默认不会自动刷新值,需要在对应bean上标注RefreshScope注解才可以
    在这里插入图片描述

八.Nacos配置灰度发布

  • 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/Btesting,即让一部分用户继续用产品特性A,一部分用户开始用产品新特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,直到把所有用户都迁移到B上面来。
  • 灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,控制其影响范围
    在这里插入图片描述

九.Nacos集群环境部署

1.找到nacos配置文件
在这里插入图片描述

2.将cluster.conf.example名称改为cluster.conf
3.修改配置为主机ip+端口号
在这里插入图片描述
4.将修改的文件保存,并且将整个nacos同步到集群主机上
5.进入nacao/bin 用sh startup.sh命令启动
6.访问主机,如果没有报错就成功了

十.Nacos服务-领域模型-健康机制

1.在NacosServer中,服务和配置是一等公民,而在Server侧服务信息的存储采用的是分级存储模型

在这里插入图片描述

  • 服务:一组功能集的抽象
  • 实例:服务在具体IP,端口上的提供者应用启动时的注册就是注册某个服务的实例
  • 集群:服务之下,实例之上的中间层,便于统一管理实例集(默认是DEFAULT)
    在这里插入图片描述
    2.Nacos中的临时实例和持久实例
  • 临时实例:nacosserver在该实例健康检查失败一定时间后会主动摘除它,且实例数据不持久化
  • 持久实例:实例数据持久化,nacosserver在该实例健康检查失败后并不摘除该实例,除非客户端主动销毁

1.nacos默认的实例类型是临时实例,可以更改
2.临时实例的应用场景大多都是上层的服务,比如:SpringCloud服务,dubbo服务等
3.持久实例的应用场景是⼀些基础的组件,例如:数据库,缓存等【想以服务的形式对外提供】
4.临时实例和持久实例在健康检查上的方式不一样:临时实例使用客户端上报模式【心跳】,持久化实例使用服务端反向探测模式

3.Nacos中的健康检测

  • Nacos中的健康检测
    • TCP端口探测
    • HTTP接口返回码探测需要在实例侧提供探测url
    • MYSQL协议探测
      在这里插入图片描述
  • Nacos集群模式下的健康检测

在这里插入图片描述
4.Nacos健康检查机制总结

  • Nacos服务的分级存储模型是:服务->集群->实例
  • Nacos实例类型有什么
    • 临时实例:数据不持久化,健康检查失败后服务端主动摘除实例,采用客户端主动上报心跳的方式进行健康检查
    • 持久实例:数据持久化,健康检查失败后服务端不摘除实例,采用的是服务端主动探测的方式进行健康检查
  • Nacos的健康检查机制
    • 临时实例:客户端5s一次上报心跳,服务端15s收不到心跳标记实例不健康,30s收不到心跳则摘除实例
    • 持久实例:服务端可以通过TCP端口探测,HTTP接口返回码探测,
      MYSQL探测三种方式进行

十一.Nacos集群一致性协议

1.Nacos是⼀个需要存储数据的⼀个组件,故在集群模式下,就需要考虑如何保障各个节点之间的数据⼀致性以及数据同步,那就不得不引入共识算法来保障各个节点之间的数据的⼀致性

2.Nacos使用了哪种类型的一致性协议?

  • Nacos是⼀个集服务注册发现以及配置管理于⼀体的组件,在集群中同时运行CP协议以及AP协议,
  • 服务注册发现:服务之间感知对方必须依赖注册中心,因此对服务注册发现中心组件的可用性,提出了很高的要求,需要在任何场景下,尽最大可能保证服务注册发现能力可以对外提供服务
    • 服务注册发现:服务之间感知对方必须依赖注册中心,因此对服务注册发现中心组件的可用性,提出了很高的要求,需要在任何场景下,尽最大可能保证服务注册发现能力可以对外提供服务
    • 持久实例:一旦创建成功,在客户端不主动删除的情况下数据一直在,因此在创建的时候就要确保大部分的节点都保存了实例信息才算成功,故需要强⼀致性共识算法来保障数据的⼀致性-CP
  • 配置管理:配置数据,是直接在Nacos服务端进行创建并进行管理的,必须保证大部分的节点都保存了此配置数据才能认为配置被成功保存了,否则就会丢失配置的变更,因此对于配置数据的管理,是必须要求集群中大部分的节点是强⼀致的-CP

3.Nacos选择了什么协议?

  • 对于强一致性共识算法最多使用的就是Raft协议,并且有很多成熟的工业算法实现,比如蚂蚁金服的JRaft、Zookeeper的ZAB、Consul的Raft、百度的braft、ApacheRatis;
  • Nacos是Java技术栈,因此只能在JRaft、ZAB、Apache Ratis中选择,但是ZAB因为和Zookeeper强绑定,再加上希望可以和Raft算法库的支持团队随时沟通交流,因此选择了JRaft
  • 最终⼀致性协议有很多,比如Gossip、Eureka内的数据同步算法
  • Nacos选择了阿里巴巴自研的Distro协议,Distro算法是集Gossip以及Eureka协议的优点并加以优化而出来的

4.Distro协议的主要设计思想

  • Nacos每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点
  • 每个节点定时发送自己负责数据的校验值到其他节点来保持数据⼀致性
  • 每个节点独立处理读请求,及时从本地发出响应

5.几个场景进行Distro协议工作原理的介绍

  • 数据初始化:新加入的Distro节点会进行全量数据拉取。具体操作是轮询所有的Distro节点,通过向其他的机器发送请求拉取全量数据
    在这里插入图片描述

  • 数据校验

    • 在Distro集群启动之后,各台机器之间会定期的发送心跳
    • 心跳信息主要为各个机器上的所有数据的元信息【校验值】
    • ⼀旦在数据校验过程中,某台机器发现其他机器上的数据与本地数据不⼀致,则会发起⼀次全量拉取请求,将数据补齐
      在这里插入图片描述
  • 写操作

    • 前置的Filter拦截请求,并根据请求中包含的IP和port等信息计算其所属的Distro责任节点,并将该请求转发到所属的Distro责任节点上
    • 责任节点上的Controller将写请求进行解析,并完成写操作
    • Distro协议定期执行Sync任务,将本机所负责的所有的实例信息同步到其他节点上
      在这里插入图片描述
  • 读操作:每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro机器会直接从本地拉取数据。快速响应
    在这里插入图片描述

  • Distro协议总结

    • Distro协议的设计思想下,每个Distro节点都可以接收到读写请求,其数据存储在缓存中,并且会在启动时进行全量数据同步,并定期进行数据校验
    • 所有的Distro协议的读写场景主要分为三种情况:
      • 当该节点接收到属于该节点负责的实例的写请求时,直接写入
      • 当该节点接收到不属于该节点负责的实例的写请求时,将在集群内部路由,转发给对应的节点完成写请求当该节点接收到
      • 任何读请求时,都直接在本机查询并返回(因为所有实例都被同步到了每台机器上)
<think>我们正在处理一个关于SpringCloudAlibaba集成MyBatis-Plus时出现的NoSuchBeanDefinitionException问题。根据之前的上下文,用户已经遇到了一些依赖冲突和版本兼容性问题(参考引用[3]和[4])。同时,用户提供的引用[1]中也有类似的启动报错,但用户已经尝试添加hibernate-validator依赖未解决,而引用[2]则提到了SpringCloud版本替换Ribbon的问题。现在,用户的问题集中在于:在SpringCloudAlibaba项目中集成MyBatis-Plus时,出现NoSuchBeanDefinitionException(具体是找不到Demo1Dao的Bean)。结合之前的讨论,这个问题通常与Bean的扫描和注册有关,但在集成的背景下,我们还需要考虑版本兼容性和依赖冲突。**可能的原因分析:**1.**MyBatis-Plus的Mapper接口未被扫描到**:在SpringBoot项目中,我们通常使用`@MapperScan`注解来指定Mapper接口的包路径。如果未配置或配置不正确,会导致Spring容器无法创建这些Mapper的Bean。2.**版本不兼容**:SpringCloudAlibabaSpringBoot和MyBatis-Plus的版本之间可能存在兼容性问题(如引用[3]和[4]所提到的)。3.**依赖冲突**:可能存在多个版本的MyBatis或MyBatis-Plus依赖,导致Bean定义被覆盖或无法加载(引用[4]提到mybatis-plus版本太高导致依赖冲突)。4.**自动配置失败**:可能是由于某些条件不满足,MyBatis-Plus的自动配置类未能正确执行。**解决方案:**1.**确认Mapper扫描配置**在SpringBoot启动类上添加`@MapperScan`注解,指定Mapper接口所在的包。例如:```java@SpringBootApplication@MapperScan("com.example.service1.dao")//替换为实际的包路径publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}```或者,可以在每个Mapper接口上使用`@Mapper`注解,但这种方式比较繁琐。2.**检查版本兼容性**根据引用[3],建议使用以下版本组合:-SpringCloud:Hoxton.SR5-SpringBoot:2.2.12.RELEASE-spring-cloud-alibaba-dependencies:2.2.1.RELEASE-MyBatisPlus:3.4.1在pom.xml中,确保使用上述兼容版本。特别是检查MyBatis-Plus的版本,避免使用过高版本(引用[4]指出高版本可能导致冲突)。3.**解决依赖冲突**使用Maven的依赖树分析工具检查冲突:```bashmvndependency:tree-Dverbose```重点检查是否有多个不同版本的MyBatis-Plus或MyBatis核心库。对于冲突的依赖,可以在pom.xml中排除低版本(通常是传递依赖引入的)。例如,如果发现某个依赖引入了低版本的MyBatis,可以这样排除:```xml<dependency><groupId>some.group</groupId><artifactId>some-artifact</artifactId><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion><exclusion><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></exclusion></exclusions></dependency>```4.**检查自动配置**在application.properties/yml中启用调试日志,查看MyBatis-Plus的自动配置是否生效:```propertiesdebug=true```启动应用后,在日志中搜索`MybatisPlusAutoConfiguration`,确认其是否被正确加载。5.**验证Bean是否存在**在启动后,通过以下方式验证Demo1Dao的Bean是否被创建:```java@SpringBootApplicationpublicclassApplicationimplementsCommandLineRunner{publicstaticvoidmain(String[]args){ConfigurableApplicationContextcontext=SpringApplication.run(Application.class,args);//检查Bean是否存在System.out.println("Demo1Daobeanexists:"+context.containsBean("demo1Dao"));}@Overridepublicvoidrun(String...args){//可以在这里注入Demo1Dao并尝试使用}}```6.**检查数据源配置**确保数据源配置正确,因为MyBatis-Plus依赖于数据源。如果数据源配置有误,也可能导致Mapper无法创建。**注意事项:**-确保在引用[2]中提到的关于SpringCloud负载均衡器的问题已经解决,因为虽然它与数据访问无关,但可能影响整体的启动过程。-如果使用了多模块项目,确保包含Mapper接口的模块被正确扫描(参考之前的讨论)。如果以上步骤仍然无法解决问题,请提供更详细的错误堆栈和配置文件内容以便进一步分析。---###测试用例在修复后,编写一个简单的单元测试来验证DAO层的Bean是否可用:```java@SpringBootTestpublicclassDemo1DaoTest{@AutowiredprivateDemo1Daodemo1Dao;@TestpublicvoidtestSelect(){List<SomeEntity>list=demo1Dao.selectList(null);assertNotNull(list);}}```---###相关问题§§相关问题§§1.**如何解决SpringBoot中MyBatis-Plus与MyBatis的依赖冲突?**2.**SpringCloudAlibaba中如何配置多数据源?**3.**MyBatis-Plus在SpringBoot启动时自动配置失败的原因有哪些?**</think> ### SpringCloud Alibaba 集成 MyBatis-Plus 出现 NoSuchBeanDefinitionException 的深度解析 #### 一、核心原因分析 1. **版本兼容性问题** - SpringCloud Alibaba、MyBatis-Plus 和 Spring Boot 版本冲突(如引用[3][4]所示) - 示例:MyBatis-Plus 3.4.1+ 与 Spring Boot 2.2.x 存在兼容性问题 ```gradle // 典型版本冲突示例 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:2.2.12.RELEASE' implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.0' // 版本过高导致冲突 } ``` 2. **Bean扫描失效** - MyBatis-Plus 的 Mapper 接口未被 Spring 扫描注册 - 常见于多模块项目或包路径配置错误 3. **依赖冲突覆盖** - 高版本 MyBatis-Plus 覆盖 Spring 核心依赖(如引用[4]) - 冲突组件:`spring-core`, `spring-beans`, `spring-context` 4. **自动配置失效** - 条件注解 `@ConditionalOnMissingBean` 被意外满足 - 其他组件(如 Hibernate Validator)缺失导致连锁异常(引用[1]) --- ### 二、解决方案(分步实现) #### 步骤1:版本兼容性修复 ```xml <properties> <!-- 兼容组合(参考引用[3]) --> <spring-cloud.version>Hoxton.SR5</spring-cloud.version> <spring-boot.version>2.2.12.RELEASE</spring-boot.version> <mybatis-plus.version>3.4.1</mybatis-plus.version> </properties> <dependencies> <!-- SpringCloud Alibaba --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> <exclusions> <!-- 排除冲突组件(参考引用[2]) --> <exclusion> <groupId>com.netflix.ribbon</groupId> <artifactId>ribbon</artifactId> </exclusion> </exclusions> </dependency> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> </dependencies> ``` #### 步骤2:强制 Bean 扫描配置 ```java @SpringBootApplication // 关键配置:明确指定扫描路径(解决多模块问题) @MapperScan(basePackages = { "com.example.service1.dao", // 主模块路径 "com.example.common.dao" // 公共模块路径 }) @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 步骤3:依赖冲突检测与解决 ```bash # 使用Maven命令检测冲突 mvn dependency:tree -Dverbose | grep conflict ``` - 常见处理方式: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <exclusions> <!-- 排除传递冲突 --> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency> ``` #### 步骤4:验证配置有效性 ```java @SpringBootTest public class BeanValidationTest { @Autowired private ApplicationContext context; @Test void testDaoBeanExists() { // 验证核心Bean是否注册成功 assertTrue(context.containsBean("demo1Dao")); // 验证数据源配置 DataSource dataSource = context.getBean(DataSource.class); assertNotNull(dataSource); } } ``` --- ### 三、典型案例解析 **问题现象**: 启动时报错 `No qualifying bean of type 'Demo1Dao'`,同时伴随: ``` Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/internal/engine/DefaultClockProvider ``` **根因分析**: MyBatis-Plus 3.5.0+ 强制依赖 Hibernate Validator,而低版本 Spring Boot (2.2.x) 未自动引入 **解决方案**: ```xml <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.7.Final</version> <!--Spring Boot 2.2兼容版本 --> </dependency> ``` --- ### 四、预防措施 | 措施 | 执行方法 | |---------------------|------------------------------------------------------------------------| | 版本锁定 | 使用 `<dependencyManagement>` 统一管理依赖 | | Bean扫描验证 | 启动时添加 `-Ddebug=true` 查看自动配置报告 | | 模块化扫描 | 公共模块配置 `@EntityScan` + `@EnableJpaRepositories` | | 兼容性检查 | 参考 [MyBatis-Plus官方兼容表](https://mp.baomidou.com/guide/#%E7%89%88%E6%9C%AC%E8%A1%A8) | --- ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值