我正在使用RESTeasy将json从有效负载转换为Web服务器中的POJO。当其中一个POJO成员是通用的时候我遇到了问题。
例如:
public class MainPOJO
{
private MyParentClass c;
[...]
}
public class MyParentClass
{
[...]
}
public class MyFirstChildClass extends MyParentClass
{
private int number;
[...]
}
public class MySecondChildClass extends MyParentClass
{
private boolean isTrue;
[...]
}
在客户端发出的请求有效负载(PUT)中,你可以找到像这样的json(注意我在“c”属性中发送了json格式的MyFirstChildClass等价物):
{
c: {number:10}
}
有没有办法告诉RESTeasy MainPOJO中的属性“c”可以是MyParentClass,MyFirstChildClass还是MySecondChildClass的实例?
目前,它只是试图实现一个MyParentClass新实例,但抛出一个错误,说该属性,例如,“number”不是标记为可忽略的。但我希望它可以更智能,并根据json中的属性从树中的右类中实例化一个对象。
有可能吗?
谢谢!
答案 0 :(得分:1)
假设您正在使用Jackson提供程序,那么处理此问题的最佳方法是通过JsonTypeInfo
注释。使用它通知Jackson你想要生成的JSON中包含的类型提示,它可以用来解析反序列化时的实际类型。
要 始终 在序列化MyParentClass
时包含类型信息,您需要对类本身进行注释:
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
public class MyParentClass {
}
或者,要仅在MyParentClass
对象被序列化时包含MainPojo
的类型信息,您需要注释该字段:
public class MainPOJO {
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
private MyParentClass c;
}
有关覆盖和选项的更多详细信息,请参阅Jackson documentation on JsonTypeInfo。