如何使用Jackson定义2级继承结构

huangapple go评论141阅读模式
英文:

How to define 2-level inheritance structure with Jackson

问题

我有以下基本(接口)结构

  1. @JsonTypeInfo(
  2. use = JsonTypeInfo.Id.NAME,
  3. property = "messageType",
  4. visible = true)
  5. @JsonSubTypes({
  6. @JsonSubTypes.Type(value = AppMessage.class, name = "APP"),
  7. @JsonSubTypes.Type(value = NotificationMessage.class, name = "NOTIFICATION"),
  8. })
  9. public interface Message {
  10. MessageType getMessageType();
  11. Date getTimestamp();
  12. }

AppMessage 类是一个简单的 POJO(目前如此),类似于

  1. public class AppMessage implements Message {
  2. private String appId;
  3. ...
  4. private Date timestamp = Date.from(Instant.now());
  5. }

NotificationMessage 是另一个接口

  1. @JsonTypeInfo(
  2. use = JsonTypeInfo.Id.NAME,
  3. property = "NotificationType",
  4. visible = true)
  5. @JsonSubTypes({
  6. @JsonSubTypes.Type(value = NotificationAckMessage.class, name = "ACK"),
  7. @JsonSubTypes.Type(value = NotificationReqMessage.class, name = "REQ"),
  8. })
  9. public interface NotificationMessage extends Message {
  10. String getDest();
  11. String getMessage();
  12. MessageType getMessageType();
  13. NotificationType getNotificationType();
  14. }

当我想反序列化 NotificationMessage 时,像这样

  1. {"NotificationType": "REQ", "dest": "some dest", "message": "some message", "messageType": "NOTIFICATION", "notificationType": "REQ", "timestamp": 1584299876847}
  2. ObjectMapper objectMapper = new ObjectMapper();
  3. Message msg = objectMapper.readValue(msgStr, Message.class);

我得到

无法构造 NotificationMessage 的实例:抽象类型需要映射到具体类型,具有自定义反序列化程序,或包含附加类型信息

当然,AppMessage 在不出现任何错误的情况下解析。

如何在不展开它的情况下实现这种结构和逻辑,即在 Message 注解级别定义所有子类型?

谢谢!

英文:

I have the following base (interface) structure

  1. @JsonTypeInfo(
  2. use = JsonTypeInfo.Id.NAME,
  3. property = "messageType",
  4. visible = true)
  5. @JsonSubTypes({
  6. @JsonSubTypes.Type(value = AppMessage.class, name = "APP"),
  7. @JsonSubTypes.Type(value = NotificationMessage.class, name = "NOTIFICATION"),
  8. })
  9. public interface Message {
  10. MessageType getMessageType();
  11. Date getTimestamp();
  12. }

the AppMessage class is a simple POJO (for now) like

  1. public class AppMessage implements Message {
  2. private String appId;
  3. ...
  4. private Date timestamp = Date.from(Instant.now());
  5. }

but the NotificationMessage is another interface

  1. @JsonTypeInfo(
  2. use = JsonTypeInfo.Id.NAME,
  3. property = "NotificationType",
  4. visible = true)
  5. @JsonSubTypes({
  6. @JsonSubTypes.Type(value = NotificationAckMessage.class, name = "ACK"),
  7. @JsonSubTypes.Type(value = NotificationReqMessage.class, name = "REQ"),
  8. })
  9. public interface NotificationMessage extends Message {
  10. String getDest();
  11. String getMessage();
  12. MessageType getMessageType();
  13. NotificationType getNotificationType();
  14. }

and of course two more pojos as NotificationAckMessage and NotificationReqMessage classes which implements NotificationMessage.

When ever I want to deserialize NotificationMessage like

  1. {"NotificationType": "REQ", "dest": "some dest", "message": "some message", "messageType": "NOTIFICATION", "notificationType": "REQ", "timestamp": 1584299876847}
  2. ObjectMapper objectMapper = new ObjectMapper();
  3. Message msg = objectMapper.readValue(msgStr, Message.class);

I get
> Can not construct instance of NotificationMessage: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

of course the AppMessage getting parsed without any errors.

How can I achieve this kind of structure and logic without flatten it, i.e define all the subtypes at the Message annotation level?

Thanks!

答案1

得分: 4

这似乎是不受支持的。看一下这个问题:https://github.com/FasterXML/jackson-databind/issues/374

最后的回答:
> 这不受支持,也没有支持的计划。不要设计你的系统,假设这将会被实现。

英文:

It seems that this is not supported. Look at this issue: https://github.com/FasterXML/jackson-databind/issues/374

The last answer:
> It is not supported and there are no plans to support it. Do not design your system assuming this will be implemented.

huangapple
  • 本文由 发表于 2020年3月16日 04:11:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/60697181.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定