0

我有一个带有通用方法的Java类。

public final class Message {

    private final MessageHeader header;
    private final Object body;

    @JsonCreator
    public <T> Message(@JsonProperty("header") MessageHeader header, @JsonProperty("body") T body) {
        this.header = header;
        this.body = body;
    }

    public MessageHeader getHeader() {
        return header;
    }

    public Object getBody() {
        return body;
    }

    @JsonIgnore
    public <T> T getBody(Class<T> objectType) {
        if(objectType.isInstance(this.body)) {
            return objectType.cast(this.body);
        }
        throw new Exception("Message body is not of type "+objectType.toString());
    }
}

使用 Jackson 2.8.4 使用启用了 DefaultTyping (mapper.enableDefaultTyping()) 的映射器对 JSON 格式的对象进行序列化和反序列化。尝试使用通用版本的 getBody 方法检索消息正文部分时遇到问题。获取 java.util.ArrayList 类型的对象,而不是传递的实际对象类型。关于缺少映射器配置或任何其他内容的任何建议?

Message.getBody 被调用如下。

DataSet data = getDataSet();
Message message = new Message(header,data);
...
DataSet data = message.getBody(DataSet.class);

添加导致问题的 JSON。

{ 
  "header" : {
    "hostId" : "XYZ",
    "hostname" : "X-123456789",
    "systemType" : "ABC"
  },"
  "body" : [ "com.foo.DataSet", {
    "createTimestamp" : 1502859923155,
    "records" : [ "java.util.ArrayList", [ {
      "name" : "Running",
      "timestamp" : 1502859923162,
      "value" : true
    }, {
      "name" : "Command",
      "timestamp" : 1502859923162,
      "value" : false
    } ] ]
  } ]
}
4

0 回答 0