Java 如何继承@JsonCreator信息
从jackson-2.6开始,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
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
。