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

application.yml 的坑:NO 变成 false、01234 变成 668,tab 和冒号后没空格各报什么

实测 Spring Boot 4.0.8 的 application.yml 常见坑:NO、yes、on 被解析成布尔值;01234 变成 668,1.10 变成 1.1;tab 缩进、冒号后无空格、重复 key、值里有冒号或以 * @ 开头各报什么;空值读出来是空字符串。

Spring Boot application.yml YAML SnakeYAML 配置文件 真实验证 动画演示
Spring 全家桶 2026-10-26

ddl-auto=validate 报 Schema validation 错误:缺表、缺列、类型不一致各是什么提示,update 会改列类型吗

实测 Spring Boot 4.0.8(Hibernate 7.2)在 MySQL 上 ddl-auto 的行为:validate 缺表、缺列、类型不一致的 Schema validation 提示;validate 不检查多余列和长度;update 会 alter 已有列的类型,有数据转不了时只打 WARN;none 推迟到第一次查询;create-drop 跑完后表不存在。

Spring Boot Hibernate ddl-auto validate Schema validation SchemaManagementException 真实验证 动画演示
Spring 全家桶 2026-10-26

TransactionRequiredException:没有事务时 persist、remove、@Modifying 的提示,以及 readOnly 里 persist 为什么有时不落库

实测 Spring Boot 4.0.8(Hibernate 7.2):没有事务时 persist、remove、merge 抛 TransactionRequiredException 而 find 可以读;@Modifying @Query 抛 InvalidDataAccessApiUsageException;自调用和新线程同样触发;readOnly 事务里 persist 在 SEQUENCE 主键下 0 行落库且不报错。

Spring Boot JPA TransactionRequiredException @Transactional @Modifying readOnly 真实验证 动画演示
Spring 全家桶 2026-10-26

PropertyReferenceException:派生查询方法名写错的几种报错,以及 @Query 写错属性名是另一种异常

实测 Spring Data JPA 4.0.7:派生查询方法名拼错(findByNme、findByIsActive、嵌套路径、大小写)启动失败 PropertyReferenceException 并给出 Did you mean 建议;参数个数不够抛 IllegalStateException;返回单个对象遇到多条抛 IncorrectResultSizeDataAccessException;@Query 里写错属性或实体名是 Hibernate 的异常。

Spring Boot Spring Data JPA PropertyReferenceException 派生查询 @Query QueryCreationException 真实验证 动画演示
Spring 全家桶 2026-10-26

DuplicateKeyException 还是 DataIntegrityViolationException:同一个数据库错误,JdbcTemplate 与 JPA 抛什么

实测 Spring Boot 4.0.8 在 MySQL 上同一个数据库错误的异常:唯一键冲突 JdbcTemplate 抛 DuplicateKeyException,Spring Data 的 saveAndFlush 抛 DataIntegrityViolationException,直接用 EntityManager 抛 Hibernate 的 ConstraintViolationException;超长、not null、外键都是 DataIntegrityViolationException;语法错误 BadSqlGrammarException;锁等待超时 CannotAcquireLockException。

Spring Boot DuplicateKeyException DataIntegrityViolationException 异常转换 JdbcTemplate JPA 真实验证 动画演示
Spring 全家桶 2026-10-26

BeanUtils.copyProperties、MapStruct 与手写 setter:7 个字段的耗时相差几十到上千倍,以及 Integer 变 Long 悄悄丢值

实测 Spring Framework 7.0.9 的 BeanUtils.copyProperties、Commons BeanUtils 1.10.1、MapStruct 1.6.3:Integer 拷到 Long 时 Spring 的版本静默跳过、null 覆盖目标默认值;MapStruct 漏映射有编译警告,可升级为错误;JMH 7 个字段耗时 MapStruct 4.4 ns、Spring 226.8 ns、Commons 7457.4 ns。

Spring Boot BeanUtils copyProperties MapStruct 对象拷贝 JMH 真实验证 动画演示
Spring 全家桶 2026-10-26

fastjson2 与 Jackson:耗时只有 0.42 和 0.20,但 null、日期、未知字段、有参构造器的默认行为差别不小

实测 fastjson2 2.0.61 与 Jackson 2.21、Jackson 3.1:序列化耗时 316 对 739 与 743 ns,反序列化 390 对 1532 与 1930 ns;默认行为差别:null 字段、日期格式、未知字段、基本类型遇 null、末尾逗号,以及 Jackson 3.1 带 -parameters 时选用有参构造器导致失败。

Spring Boot fastjson2 Jackson Jackson 3 JSON 序列化 真实验证 动画演示
Spring 全家桶 2026-10-26

Logback AsyncAppender 默认只写下 2% 的 INFO 日志:异步日志的耗时与丢失率实测,以及 Log4j2 配 Disruptor 4.0.0 丢行

实测 Logback 1.5.38 与 Log4j2 2.25.5 异步日志:Logback AsyncAppender 默认配置单次 63 ns,但写入率只有 1.9%,discardingThreshold = 0 后 3226 ns、不丢;Log4j2 三种写法都不丢但没有比同步快;Log4j2 全异步配 Disruptor 4.0.0 多线程下写入率 6.6%,3.4.4 为 100.0%。

Spring Boot Logback Log4j2 AsyncAppender 异步日志 Disruptor 真实验证 动画演示
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 测试 升级 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号