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

Port 8080 was already in use:报错原文,以及同一个端口两个实例都能启动成功的情形

实测 Spring Boot 的 Port was already in use:Boot 4.0.8 与 3.5.16 报错文字一致(PortInUseException);在本机 macOS 上,一个实例监听 127.0.0.1、另一个监听 0.0.0.0 时两个都能启动;server.port=0 用随机端口。

Spring Boot Port 8080 was already in use PortInUseException server.port FailureAnalyzer 真实验证 动画演示
Spring 全家桶 2026-10-26

NoUniqueBeanDefinitionException:两个候选 Bean 时,字段名、@Primary、@Qualifier、-parameters 各管什么

实测 Spring Boot 4.0.8 的 NoUniqueBeanDefinitionException:两个 Bean 时字段名、@Primary、@Qualifier 如何选择;两个 @Primary 与 @Qualifier 拼错各报什么;List/Map 注入顺序;ObjectProvider.getIfUnique 静默返回 null;构造器参数名在没有 -parameters 时对不上。

Spring Boot NoUniqueBeanDefinitionException @Primary @Qualifier 依赖注入 真实验证 动画演示
Spring 全家桶 2026-10-26

Whitelabel Error Page:Boot 4 里 server.error.* 不生效了,要改成 spring.web.error.*

实测 Spring Boot 4.0.8 的 Whitelabel Error Page:默认 JSON 只有 timestamp、status、error、path;server.error.* 全部写了不生效也不报错,要改成 spring.web.error.*;include-message、include-stacktrace、whitelabel.enabled 各自的效果;静态 404.html 与自定义 ErrorController。

Spring Boot Spring Boot 4 Whitelabel Error Page server.error spring.web.error ErrorController 真实验证 动画演示
Spring 全家桶 2026-10-26

Failed to bind properties:@ConfigurationProperties 的几种绑定报错,以及 ignoreUnknownFields = false 为什么对 -D 参数没反应

实测 Spring Boot 4.0.8 的 @ConfigurationProperties 绑定失败:类型转换、枚举、Duration、@Min 与 @NotBlank 校验各报什么;ignoreUnknownFields = false 对配置文件中拼错的 key 报 left unbound,但对 -D 系统属性不起作用;宽松绑定与列表写法。

Spring Boot @ConfigurationProperties BindException Failed to bind properties ignoreUnknownFields 真实验证 动画演示
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 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号