我有一个带有通用方法的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
} ] ]
} ]
}