如何继承@JsonCreator信息

时间:2016-10-12 08:09:22

标签: java jackson

从jackson-2.6开始,required属性仅用于@JsonCreator。我有两个课程ABA具有必填属性,B继承自A

当我们使用@JsonCreator时,我们无法从超类中获取属性信息。请参阅以下代码,B不检查所需的属性' a&#39 ;

如果我们有许多必需的属性,如何继承?我不想重复写@JsonProperty

public class App {

  public static void main(String[] args) {
    ObjectMapper objMapper = new ObjectMapper();

    String jsonA = "{}";              // miss 'a'
    try {
      objMapper.readValue(jsonA, A.class);
    } catch (IOException e) {
      System.out.println("A: Should get exception");  // happen
      e.printStackTrace();
    }

    String jsonB = "{\"b\":\"B\"}";   // miss 'a'
    try {
      objMapper.readValue(jsonB, B.class);
    } catch (IOException e) {
      System.out.println("B: Should get exception"); // not happen
      e.printStackTrace();
    }
  }
}


class A {
  private String a;

  public A() {
  }

  @JsonCreator
  public A(@JsonProperty(value = "a", required = true) String a) {
    this.a = a;
  }

  public String getA() {
    return a;
  }
}

class B extends A {
  private String b;

  @JsonCreator
  public B(@JsonProperty(value = "b", required = true) String b) {
    this.b = b;
  }

  public String getB() {
    return b;
  }
}

1 个答案:

答案 0 :(得分:1)

构造函数不是继承的。在您的示例中,B调用无参数构造函数A()。请注意,从A()类中删除A时,解决方案将无法编译。

在您的情况下,当您需要类B具有属性a和b时,您需要将该属性作为B的构造函数参数

 @JsonCreator
  public B(@JsonProperty(value = "a", required = true) String a,
           @JsonProperty(value = "b", required = true) String b,
) {
    super(a);
    this.b = b;
  }

您可以通过A(String a)调用参数化构造函数B(String a, String b)来重用它。

您也可以不使用构造函数和注释字段ab作为@JsonProperty。 然后它应该没有任何构造函数或任何其他代码。