SpringBoot 4 踩坑实录:实体类直接赋默认值失效?Controller 接收为 null 的解决方案
最近把项目版本升级为SpringBoot 4后遇到了一个非常隐蔽的问题在 DTO 实体类中直接通过private String flag 1;这种方式给字段赋默认值前端不传该参数、或者传空值时Controller 接收后该字段竟然为 null默认值完全不生效排查后发现这是 SpringBoot 4 在参数绑定、实体类注入逻辑上的优化 / 变更导致的实体类直接声明式赋值的默认值在 SpringMVC 参数封装时会被覆盖无法正常生效。如果还沿用 SpringBoot 2/3 的写法直接在字段上赋默认值就会出现业务逻辑异常比如判断 flag1 执行默认逻辑结果字段为 null 直接空指针。✅ 最终解决方案重写 Setter 方法实现强制默认值赋值核心思路放弃字段直接赋默认值通过重写 Setter 方法在参数注入时做非空判断强制兜底默认值这是 SpringBoot 4 中最稳妥的实体类默认值赋值方案。直接上完整可用的代码import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; import java.io.Serial; import java.io.Serializable; /** * SpringBoot4 测试请求DTO * 解决实体类直接赋默认值失效Controller接收为null的问题 */ Data AllArgsConstructor NoArgsConstructor public class TestReqDto implements Serializable { Serial private static final long serialVersionUID -5927470874391722770L; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 标识字段SpringBoot4直接赋值1失效需通过setter注入 */ private String flag; /** * 重写flag的setter方法 * 解决SpringBoot4 实体类默认值赋值失效、Controller接收为null的问题 * 规则前端传入非空值 → 用传入值为空/空串/空白 → 强制赋值默认值1 * param flag 前端传入的标识参数 */ public void setFlag(String flag) { if (StringUtils.isNotBlank(flag)) { this.flag flag; } else { // 强制兜底默认值 this.flag 1; } } }核心说明废弃直接赋值删除private String flag 1;这种声明式赋值SpringBoot 4 不再支持这种方式的参数绑定默认值重写 Setter 方法利用apache-commons-lang3的StringUtils.isNotBlank()判断参数是否有效兼容null、空字符串、纯空白字符串 强制兜底只要前端传入的参数无效就强制将字段赋值为默认值1彻底解决默认值失效问题。这个方案完美适配 SpringBoot 4 的参数注入逻辑不管前端不传参、传 null、传空串都能保证flag字段一定有默认值杜绝空指针异常和业务逻辑错误总结SpringBoot 4 变更点实体类字段直接赋默认值在 Controller 参数接收时会失效结果为 null最优解重写 Setter 方法做非空判断强制注入默认值兼容性该写法同时兼容 SpringBoot 低版本升级无风险通用性极强。