从jackson-2.6开始,required
属性仅用于@JsonCreator
。我有两个课程A
和B
。 A
具有必填属性,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;
}
}
答案 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)
来重用它。
您也可以不使用构造函数和注释字段a
和b
作为@JsonProperty
。
然后它应该没有任何构造函数或任何其他代码。