我刚开始使用Jackson&反序列化JSON。我正在尝试创建一个消息处理器并具有以下内容:
@JsonDeserialize(builder = TestMessage.TestMessageBuilder.class)
private static class TestMessage {
@Nonnull
private Long timestamp;
@Nonnull
private String regionId;
@Nonnull
private String userId;
@Nonnull
private String action;
@Nonnull
private TestMessageMetadata metadata;
@JsonPOJOBuilder(withPrefix = "")
public static class TestMessageBuilder {}
}
问题在于,根据消息的类型操作类型,TestMessageMetadata将需要是一组几个不同的子类之一。 例如,如果action是“stream”,则TestMessageMetadata必须是TestMessageStreamMetadata类型。 TestMessageMetadata的每个子类都有不同的属性(TestMessageStreamMetadata可能有4个字段仅适用于“流”类型的消息,而对于某些其他操作,可能只有1个字段仅适用于该类型的操作等。)
处理器只需要有一个总体消息类,那么有哪些方法可以处理多种动作类型?非常感谢帮助!
答案 0 :(得分:1)
问题在于,取决于消息的动作类型 随之而来的是,TestMessageMetadata将需要成为一组中的一员 一些不同的子类。
似乎在寻找@JsonTypeInfo
。 @JsonTypeInfo
用于处理多态类型。它配置了属性值的实际类型可能是多个子类型之一的情况。
以下是一个例子:
class TestMessage {
private String action;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_POPERTY, propery = "action")
@JsonSubTypes({
@JsonSubTypes.Type(value = TestMessageStreamMetadata.class, name = "stream"),
@JsonSubTypes.Type(value = TestMessageFooMetadata.class, name = "foo")
})
private TestMessageMetadata metadata;
}