知其然,知其所以然
Spring 全家桶 2026-10-23

Spring Boot 3.5 升到 4.0:只改版本号,会遇到哪些编译和启动错误

实测 Spring Boot 3.5.16 升到 4.0.8:同一组 starter 只改版本号,spring-boot-starter-aop 在 BOM 里消失,32 个常见旧 import 只剩 9 个能编译,其余 23 个搬了包或改了名;spring-boot-starter-classic 不能救回旧 import;应用本身仍能启动,/actuator/health 多了 groups 字段。

Spring Boot 4 升级 3.5 编译错误 starter 真实验证 动画演示
Spring 全家桶 2026-10-23

Boot 4 里静默失效的配置属性:旧 key 逐个实测

实测 Spring Boot 3.5.16 升到 4.0.8 后失效的配置属性:扫描各模块配置元数据,3.5 里有效的 1983 个里有 50 个不再声明、103 个标 error 级弃用(共 153 个);server.error.include-message 等旧 key 在 4.0.8 上静默无效、启动日志不提;properties-migrator 能抓到 classpath 上有模块的改名,抓不到已经不存在的 key。

Spring Boot 4 配置属性 升级 properties-migrator 静默失效 真实验证 动画演示
Spring 全家桶 2026-10-23

Jackson 3 与 Spring Boot 4:包名变了,哪些代码编译不过

实测 Jackson 2.21.5 与 Jackson 3.1.5(Spring Boot 4.0.8):包名从 com.fasterxml 变成 tools.jackson 但注解包不变;20 段常见写法只换包名后只有 8 段能编译(configure、JsonProcessingException、JavaTimeModule、JsonSerializer 等都要改);Jackson 3 默认日期输出 ISO 字符串、字段按字母序、未知属性不失败、null 读进 int 失败;Boot 4 里 spring.jackson.serialization.write-dates-as-timestamps 会让应用启动失败。

Jackson 3 Spring Boot 4 升级 tools.jackson ObjectMapper 真实验证 动画演示
Spring 全家桶 2026-10-23

@MockBean 在 Boot 4 里去哪了:测试注解迁移对照

实测 @MockBean 迁移到 Spring Boot 4 的 @MockitoBean:属性 value 从 Class[] 变成 String、classes 改名 types;打桩重置、凭空创建、按名字替换、Spy 两边一致;同类型两个 Bean 不指定名字两边都失败(信息不同);写在 @TestConfiguration 类上 3.5 有效而 4.0.8 静默不生效;新增 enforceOverride。

Spring Boot 4 MockBean MockitoBean SpyBean 测试 升级 真实验证 动画演示
Spring 全家桶 2026-10-23

Spring Security 7:旧写法编译不过的清单与替换

实测 Spring Security 6.5(Boot 3.5.16)升到 7.0(Boot 4.0.8):32 种常见写法 6.5 通过 27 个、7.0 通过 14 个;csrf()、formLogin()、authorizeRequests() 等无参重载与 .and() 链式、AntPathRequestMatcher、MvcRequestMatcher、FilterSecurityInterceptor、AccessDecisionManager 在 7.0 里没了,DaoAuthenticationProvider 无参构造也没了;lambda 写法的配置在两个版本上授权结果一致。

Spring Security 7 Spring Boot 4 升级 authorizeRequests AntPathRequestMatcher 真实验证 动画演示
Spring 全家桶 2026-10-23

Hibernate 7 随 Boot 4 升级后,哪些行为变了

实测 Spring Boot 3.5.16(Hibernate 6.6.53)升到 4.0.8(Hibernate 7.2.24):同一份实体在 MySQL 上生成的表与 DDL 完全一致,旧库 validate 与 update 都不动;join fetch 分页、22 条 HQL 里 21 条结果一致;变的是 API:MySQL8Dialect、@Where、@Proxy、Session.save、saveOrUpdate 在 7.2 里找不到。

Hibernate 7 Spring Boot 4 升级 JPA HQL 真实验证 动画演示
Spring 全家桶 2026-10-23

Boot 4 升级后依赖没变却悄悄失效:Flyway、Kafka、RestClient 缺什么就加哪个 starter

实测 Spring Boot 4.0.8 的 starter 拆分:只把版本从 3.5.16 换成 4.0.8、依赖不动,Flyway、Liquibase、spring-kafka、RestClient.Builder、WebClient.Builder 的自动配置静默消失(类在 classpath 上、容器里没有 Bean,没有报错);AOP 与 Prometheus 不受影响。

Spring Boot 4 starter 自动配置 升级 Flyway Liquibase Kafka 真实验证 动画演示
Spring 全家桶 2026-10-23

NoSuchBeanDefinitionException:几种成因逐个复现

实测 Spring Boot 4.0.8 里 NoSuchBeanDefinitionException(could not be found)的六种成因:忘了加 @Component、包扫描范围之外、@Profile 没激活、@ConditionalOnProperty 不满足、接口没有实现 Bean、@Bean 返回类型写成 Object,启动报错一字不差;条件报告与 TRACE 日志各能区分哪几种;List<T> 找不到时不报错而是注入空集合。

Spring Boot NoSuchBeanDefinitionException 依赖注入 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

Failed to configure a DataSource:怎么来的、怎么修

实测 Spring Boot 4.0.8 里 Failed to configure a DataSource 的成因:没有 url、拼错属性名、驱动缺失得到的报错不同;H2 与环境变量可以启动;starter-jdbc 下连不上、密码错、库不存在都是第一次用连接才失败,starter-data-jpa 启动就失败;排除 DataSourceAutoConfiguration 的旧类名在 Boot 4 里被静默忽略。

Spring Boot DataSource 数据库连接 Hikari 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

LazyInitializationException:几种修法的代价对比

实测 Spring Boot 4.0.8 + Hibernate 7.2 的 LazyInitializationException:默认 open-in-view=true 时不会出现但连接被请求占着(active=1)、N+1 是 6 条 SQL;关掉后直接访问懒加载集合抛 no session,@Transactional 仍是 6 条,join fetch、@EntityGraph、DTO 投影都是 1 条;hibernate.enable_lazy_load_no_trans 压住异常却要 11 条 SQL、6 个 Session。

Spring Boot JPA LazyInitializationException N+1 open-in-view 真实验证 动画演示
Spring 全家桶 2026-10-23

Unable to find a @SpringBootConfiguration:测试里为什么找不到主类

实测 Spring Boot 4.0.8 的 Unable to find a @SpringBootConfiguration:测试类从自己的包往上找,同包与子包能找到,兄弟包、父包、无关包都找不到;classes = App.class 与 @ContextConfiguration 能补救,嵌套 @Configuration 会得到只有 8 个 Bean 定义的几乎空上下文,嵌套 @TestConfiguration 不算;同一个包有两个主类时报 Found multiple。

Spring Boot 测试 SpringBootConfiguration SpringBootTest 排错 真实验证 动画演示
Spring 全家桶 2026-10-23

Spring MVC 的 400、404、405、406、415 各由谁抛出

实测 Spring Boot 4.0.8 的 Spring MVC 4xx 来源:404 多数是 NoResourceFoundException(静态资源处理器抛的,结尾斜杠也是);405、406、415 都在 RequestMappingInfoHandlerMapping.handleNoMatch;400 有 MissingServletRequestParameterException、MethodArgumentTypeMismatchException、HttpMessageNotReadableException、MethodArgumentNotValidException 等;缺 multipart 是 500;非法百分号编码由 Tomcat 直接 400。

Spring MVC 400 404 405 406 415 异常处理 排错 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号