Jackson TypeFactory的静态方法已被弃用,应该使用什么替代?(涉及IT技术)

9

Jackson中的Typefactory类中有许多已弃用的方法。我正在这样使用它:

public List<T> getX(Class<T> clz) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        String jsonData = mapper.writeValueAsString(data);
        a = mapper.readValue(jsonData, TypeFactory.collectionType(List.class, clz));
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    return a;// a is a global variable
}

它警告我说collectionType已经过时。请问该使用什么替代它?


使用TypeReference代替。参见此链接 https://dev59.com/EHE85IYBdhLWcg3w9onw 的被接受的回答。 - Varun Achar
我无法使用TypeReference泛型。 - kamaci
1个回答

15

TypeFactory本身并未过时,只有静态方法过时了,例如"constructType"等实例方法仍然可用。因此问题的关键是从哪里获得要使用的TypeFactory实例。

通常情况下,您可以通过ObjectMappergetTypeFactory方法获得TypeFactory实例;或者通过SerializationConfig/DeserializationConfig来获取。它们携带一个实例。 如果这些方法都不行,还有TypeFactory.instance可以使用。

之所以将某些静态方法标记为过时,是因为一些扩展模块需要替换标准工厂:特别是Scala模块需要扩展类型处理以支持Scala集合(等)类型--默认情况下这些无法正常工作,因为Scala没有继承java.util版本。


感谢您详细的解释并点赞。我会测试您的建议。您认为从ObjectMapper中使用getTypeFactory方法还是TypeFactory.instance更好呢?或者两者都可以使用,没有太大区别吗? - kamaci
理想情况下使用ObjectMapper.getTypeFactory(),因为它可能已被覆盖。但是构建一个新的映射器来获取访问权限是没有意义的;所以如果您没有映射器(或序列化/反序列化配置),只需使用.instance即可。 - StaxMan
我有一个 mapper 变量,然后我执行了 mapper.readValue(jsonData, mapper.getTypeFactory().collectionType(List.class, clz)); 但是它仍然被弃用了? - kamaci
4
collectionType() 是静态方法;请改用 constructCollectionType 方法。 - StaxMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接