Java 如何继承@JsonCreator信息

Java 如何继承@JsonCreator信息,java,jackson,Java,Jackson,从jackson-2.6开始,required属性仅用于@JsonCreator。我有两个班A和BA具有必需的属性,而B是从A继承的 当我们使用@JsonCreator时,我们无法从超类中获取属性信息。请参阅下面的代码,B没有检查所需的属性“a” 如果我们有许多必需的属性,如何继承?我不想重复写@JsonProperty public class App { public static void main(String[] args) { ObjectMapper objMappe

从jackson-2.6开始,
required
属性仅用于
@JsonCreator
。我有两个班
A
B
<代码>A具有必需的属性,而
B
是从
A
继承的

当我们使用
@JsonCreator
时,我们无法从超类中获取属性信息。请参阅下面的代码,
B
没有检查所需的属性“a”

如果我们有许多必需的属性,如何继承?我不想重复写
@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;
  }
}

构造函数不是继承的。在您的示例中,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;
  }
通过从
B(字符串A,字符串B)
调用参数化构造函数,可以重用该构造函数
A(字符串A)

也不能将构造函数和注释字段
a
b
用作
@JsonProperty

那么它应该在没有任何构造函数或任何附加代码的情况下工作。

谢谢。但我的问题是我有很多
必需的
,我不想重复多次写入
@JsonProperty
。如果我不使用构造函数和
@JsonCreator
,我无法确保“a”存在。您可以直接在每个字段写入@JsonProperty(必需=true)。这样就可以继承所需的属性。但您不会在构造函数级别进行验证(对于手动构建对象)。为此,在每个类中都需要构造函数。对于Jackson,您可以向每个类添加无参数私有构造函数。由于Jackson-2.6,
required
属性仅用于
@JsonCreator