使用具有通用列表属性

时间:2017-06-01 07:11:26

标签: java jackson

升级后的jackson到2.8.8版本后我无法反序列化泛型类。 我为DataJson使用自定义反序列化器,升级后杰克逊获得JsonMappingException

    com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.example.dto.ConcernData: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: {
  "type": {
    "name": "TYPE_NAME"
  },
  "people": [
    {"id": 1}
  ]
}; line: 6, column: 5] (through reference chain: com.example.dto.DataJson["people"]->java.util.ArrayList[0])

我能够反序列化DataJson的杰克逊的最新版本是2.6.7。

https://github.com/maselpopowo/JacksonDeserializerIssue

1 个答案:

答案 0 :(得分:1)

如果您定义DataJson以扩展具有相同类型BasicDataJson的(通用)T,则在2.8.8中可以正常工作。 E.g。

public class DataJson<T extends ConcernData> extends BasicDataJson<T>

而不是像extends BasicDataJson这样的原始类型。

我注意到它适用于Jackson 2.6.x但不适用于2.7.x或2.8.x.请注意Jackson 2.7 here

的发行说明中的​​这一段
  

某些棘手的边缘情况不起作用。   具体来说,键入变量别名(变量名称如T的情况   在层次结构中的不同点处绑定到不同类型)不是   正确解析,因为变量绑定是全局构造的   不是等级的。