与杰克逊的反序列化的建造者样式

时间:2014-12-10 20:01:33

标签: java json jersey jackson deserialization

  

要求:

     
    
        
  1. 想使用Builder模式
  2.     
  3. 杰克逊进行反序列化
  4.     
  5. 不想使用setter
  6.        

我确信杰克逊的工作基于POJO上的getter和setter。既然,我有建造者模式,再没有重要的东西。在这种情况下,我们如何在Builder模式的帮助下指示jackson反序列化?

任何帮助将不胜感激。我试过@JsonDeserialize(builder = MyBuilder.class)并且无法正常工作。

REST球衣需要这样做。我目前是杰克逊编组和解编的jersey-media-jackson maven模块。

1 个答案:

答案 0 :(得分:14)

只要你的类路径上有@JsonDeserialize

jackson-databind就可以了。以下代码段是从Jackson Documentation

复制而来的
@JsonDeserialize(builder=ValueBuilder.class)
public class Value {
  private final int x, y;
  protected Value(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

public class ValueBuilder {
  private int x, y;

  // can use @JsonCreator to use non-default ctor, inject values etc
  public ValueBuilder() { }

  // if name is "withXxx", works as is: otherwise use @JsonProperty("x") or @JsonSetter("x")!
  public ValueBuilder withX(int x) {
    this.x = x;
    return this; // or, construct new instance, return that
  }
  public ValueBuilder withY(int y) {
    this.y = y;
    return this;
  }

  public Value build() {
    return new Value(x, y);
  }
}

或者,如果您不喜欢具有@JsonPOJOBuilder前缀的方法名称,请使用with

@JsonPOJOBuilder(buildMethodName="create", withPrefix="con")
public class ValueBuilder {
  private int x, y;

  public ValueBuilder conX(int x) {
    this.x = x;
    return this; // or, construct new instance, return that
  }
  public ValueBuilder conY(int y) {
    this.y = y;
    return this;
  }

  public Value create() { return new Value(x, y); }
}