Spring Boot中如何基于POJO其他字段值自动设置字段值?
当然可以在POJO内部实现这个逻辑,把字段的业务规则封装在类本身,避免上层代码重复写if-else。下面是几种实用的实现方式:
方案1:通过Setter方法封装逻辑
直接在isEnabled的Setter中添加字段赋值逻辑,无论通过什么方式设置isEnabled(包括Spring反序列化RequestBody),都会自动触发field的处理:
class POJO { private boolean isEnabled; private String field; public void setIsEnabled(boolean isEnabled) { this.isEnabled = isEnabled; // 当isEnabled为true时,强制设置field为"TEST" if (isEnabled) { this.field = "TEST"; } // 为false时不做处理,保留原有值(包括反序列化传入的内容) } public String getField() { return field; } public void setField(String field) { // 可选:只有当isEnabled为false时才允许修改field if (!this.isEnabled) { this.field = field; } } public boolean isEnabled() { return isEnabled; } }
如果希望isEnabled为true时完全禁止外部修改field,可以在setField里加判断,只允许在禁用状态下赋值。
方案2:利用Jackson的@JsonSetter适配RequestBody反序列化
如果是Spring通过Jackson解析RequestBody,可以用@JsonSetter在反序列化阶段直接处理规则,确保解析后的POJO直接符合要求:
import com.fasterxml.jackson.annotation.JsonSetter; class POJO { private boolean isEnabled; private String field; @JsonSetter public void setIsEnabled(boolean isEnabled) { this.isEnabled = isEnabled; if (isEnabled) { this.field = "TEST"; } } @JsonSetter public void setField(String field) { // 反序列化时,只有禁用状态才接受传入的field值 if (!this.isEnabled) { this.field = field; } } // Getter方法省略 }
这种方式专门针对JSON反序列化场景,上层代码不需要做任何额外处理。
方案3:用Builder模式封装规则
如果你的POJO用Builder构造(比如配合Lombok的@Builder),可以在Builder的build()方法里加入逻辑:
import lombok.Builder; import lombok.Getter; @Getter @Builder class POJO { private boolean isEnabled; private String field; // 自定义Builder的build方法 public static class POJOBuilder { public POJO build() { if (this.isEnabled) { this.field = "TEST"; } return new POJO(isEnabled, field); } } }
无论是手动用Builder创建POJO,还是配合Jackson的Builder反序列化,都能自动应用规则。
内容的提问来源于stack exchange,提问作者Ryan Fernandes
相关产品推荐
相关产品推荐

