我的问题就像“Jackson and generic type reference”,但是由于我的泛型类是抽象的附加皱纹,所以我必须将它映射到具体类型。这曾经在杰克逊v2.5.3下运作良好,但杰克逊(v2.7.2或更早版本)最近的变化打破了它。
我有抽象类Page和具体类PageImpl。我曾经能够将Page反序列化为PageImpl,没问题:
SimpleModule module = new SimpleModule().addAbstractTypeMapping(Page.class, PageImpl.class)
ObjectMapper objectMapper = new ObjectMapper().registerModule(module);
但是现在,我通过调试源来了解到,当Jackson将抽象类型映射到具体类型时,它会丢弃类型绑定。这意味着,如果我告诉杰克逊将给定的JSON字符串设置为类型Page< XYZ> ...
value = objectMapper.readValue(json,
typeFactory.constructSimpleType(Page.class,
new JavaType[]{typeFactory.constructSimpleType(XYZ.class, null)}));
...它会将输出类型映射到PageImpl,但它会在将JSON反序列化为PageImpl之前删除类型绑定。这导致PageImpl POJO包含LinkedHashMap对象的List,而不是XYZ对象列表。
我不确定杰克逊为什么会这样改变;这似乎是一个bug。寻找有关变通方法的建议。谢谢!
答案 0 :(得分:1)
尝试2.7.5:由于类型分辨率重写有一些问题,虽然大多数是由2.7.3修复的,但在2.7.4中还有一个。所以很有可能你确实碰到了一个错误。
一般来说,最好试用你所拥有的次要版本的最新补丁版本:此时没有充分理由使用2.7.2,超过2.7.5。