
本文介绍如何在 Java Builder 模式中,使用 Apache Commons Lang 的 StringUtils.isNotBlank() 安全地实现字段的“非空则更新、为空则保留原值”的逻辑,避免因直接赋值 null 或空白字符串导致的数据污染。
本文介绍如何在 java builder 模式中,使用 apache commons lang 的 `stringutils.isnotblank()` 安全地实现字段的“非空则更新、为空则保留原值”的逻辑,避免因直接赋值 null 或空白字符串导致的数据污染。
在基于 Builder 模式的实体构造过程中(如 Lombok @Builder 或自定义 Builder),常需对部分字段做“有值才覆盖、无值则沿用旧值”的处理。但 Builder 链式调用本身不支持 if 语句嵌入,因此需借助三元运算符(? :)结合字符串判空工具完成条件赋值。
首先,确保项目已引入 Apache Commons Lang 3(推荐版本 3.12.0+)。若使用 Gradle,在 build.gradle 中添加:
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
执行 ./gradlew build 或通过 IDE 同步依赖后,即可导入并使用:
import org.apache.commons.lang3.StringUtils;
public WfccApplicationEntity constructApplicationEntity(
UpdateWfccApplicationDecisionRequest request,
WfccApplicationEntity entity) {
return entity.toBuilder()
.statusCode(request.getStatusCode())
.caseNumber(request.getCaseNumber())
.updatedBy(request.getUpdatedBy())
.apr(StringUtils.isNotBlank(request.getApr())
? request.getApr()
: entity.getApr())
.aprType(StringUtils.isNotBlank(request.getAprType())
? request.getAprType()
: entity.getAprType())
.statusCodeUpdatedDate(now())
.customerId(request.getCustomerId())
.build(); // 注意:原代码中 statusCodeUpdatedDate 被重复调用,此处已去重
}
✅ 关键说明:
- StringUtils.isNotBlank() 同时校验 null、空字符串 "" 和纯空白(如 " "),比 != null && !"".equals() 更健壮;
- 使用 entity.getApr() 作为默认值,确保未提供新值时保留原有数据,符合幂等更新语义;
- 避免在 .build() 前重复调用同名 setter(如原代码中两次 .statusCodeUpdatedDate(now())),应仅保留一次;
- 若 apr 或 aprType 字段为 null 安全类型(如 String),该方案天然兼容;若为非空注解(如 @NonNull)字段,需确认 entity.getApr() 不会抛出 NPE。
该写法兼顾可读性、安全性与函数式风格,是微服务或领域驱动设计中常见的“增量更新”实践范式。











