【问题标题】:Manage attributes inheritance with RESTeasy使用 RESTeasy 管理属性继承
【发布时间】:2013-02-01 13:43:35
【问题描述】:

我正在使用 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 新实例,但抛出一个错误,指出该属性,例如,“数字”未标记为可忽略。但我希望它可以更智能,并根据 json 中的属性从树中正确的类中实例化一个对象。

有可能吗?

谢谢!

【问题讨论】:

  • 您使用的是 Jettison 还是 Jackson 提供程序?
  • 我们正在使用 Jackson 提供程序。

标签: java json rest jax-rs pojo


【解决方案1】:

假设您使用的是 Jackson 提供程序,那么处理此问题的最佳方法是通过 JsonTypeInfo 注释。使用它会通知 Jackson 您希望在生成的 JSON 中包含类型提示,当涉及到反序列化时,它可以用来解析实际类型。

始终在您的MyParentClass 被序列化时包含类型信息,您需要对类本身进行注释:

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
public class MyParentClass {
}

或者,如果要在序列化 MainPojo 对象时仅包含 MyParentClass 的类型信息,您可以注释该字段:

public class MainPOJO {
    @JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
    private MyParentClass c;
}

有关覆盖和选项的更多详细信息,请参阅Jackson documentation on JsonTypeInfo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多