如何为Java的Relationship类实现builder()方法支持JSON序列化
实现步骤
你只需要做对应修改就能符合调用要求:
1. 添加静态builder()方法
在Relationship类的内部(和私有构造方法平级的位置)添加如下静态方法,直接返回Builder实例即可:
public static Builder builder() { return new Relationship.Builder(); }
2. 修正现有代码和调用逻辑不匹配的问题
你当前的代码和你期望的调用写法有两处不兼容,需要同步修改:
- Builder类的属性赋值方法前缀不符合:你调用的是
.relationshipType("uses"),但现有方法是setRelationshipType,需要去掉set前缀,同时可以同步修正不规范的字段名relationshipType1避免歧义 - 你调用了
.created(Instant.now()),但现有Relationship类和Builder类都没有created字段,需要补充该字段的定义、构造方法参数和Builder赋值方法 - 若要Jackson的序列化/反序列化正常工作,需要给
@JsonPOJOBuilder添加withPrefix = ""参数,指定Builder的赋值方法没有前缀
修改后的完整代码如下:
import java.time.Instant; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; @JsonDeserialize(builder = Relationship.Builder.class) public class Relationship { private String relationshipType; private String description; private DomainObject sourceRef; private DomainObject targetRef; // 补充created字段 private Instant created; private Relationship(String relationshipType, String description, DomainObject sourceRef, DomainObject targetRef, Instant created) { this.relationshipType = relationshipType; this.description = description; this.sourceRef = sourceRef; this.targetRef = targetRef; this.created = created; } // 新增的builder静态方法 public static Builder builder() { return new Builder(); } // 修正后的Builder类 @JsonPOJOBuilder(withPrefix = "") // 指定赋值方法没有前缀 public static class Builder{ String relationshipType; String description; DomainObject sourceRef; DomainObject targetRef; Instant created; public Builder relationshipType(String relationshipType) { this.relationshipType = relationshipType; return this; } public Builder description(String description) { this.description = description; return this; } public Builder sourceRef(DomainObject sourceRef) { this.sourceRef = sourceRef; return this; } public Builder targetRef(DomainObject targetRef) { this.targetRef = targetRef; return this; } // 补充created的赋值方法 public Builder created(Instant created) { this.created = created; return this; } public Relationship build() { return new Relationship(relationshipType, description, sourceRef, targetRef, created); } } }
修改完成后你给出的调用代码就可以正常运行。
内容的提问来源于stack exchange,提问作者AnaGutiFontan
相关产品推荐
相关产品推荐

