1

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

是否可以?

谢谢!

4

1 回答 1

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;
}

有关覆盖和选项的更多详细信息,请参阅JsonTypeInfo 上的 Jackson 文档。

于 2013-02-01T14:39:15.083 回答