使用RESTeasy管理属性继承

时间:2013-02-01 13:43:35

标签: java json rest jax-rs pojo

我正在使用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中的属性从树中的右类中实例化一个对象。

有可能吗?

谢谢!

1 个答案:

答案 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