杰克逊收集反序列化的最佳实践

时间:2013-11-14 14:01:14

标签: java json jackson mutators

假设我有一个简单的类人物

public class Person{
  final List<String> names= Lists.newArrayList();

  public List<String> getNames(){
    return names;
  }
}

如果我试图用杰克逊(2.2)对其进行反序列化

Person l = mapper.readValue(js,Person.class);

我得到Disabling Afterburner deserialization ....due to access error (type java.lang.IllegalAccessError ....

这是因为最终 名称列表。要解决此问题,我将MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS设置为false

这是正确的解决方案还是更好的只是让列表非最终?

是否有使用collection.add方法初始化集合的Jackson方法?

或许有更好的方法。这里有什么建议?

编辑:我现在找到了这个设置:

  

USE_GETTERS_AS_SETTERS(默认值:true)控制是否为“getters”   return Collection或Map类型可用于“设置”值(相同   就像JAXB API如何与XML一起工作一样,所以单独的“setter”方法就是如此   不需要。即使启用,显式“setter”方法也会有   优先于隐式getter-as-setter(如果存在)。

看起来就像我正在寻找的那样,它默认开启。那么为什么它会被忽略呢?

2 个答案:

答案 0 :(得分:2)

在应用程序中使用不可变对象是最佳实践,但在(非Java)外部世界的边界上,您通常必须避免使用它们。

在大多数序列化技术中,当对象“表现良好”(可变,根据JavaBeans标准使用getter和setter)时,一切正常。通常有一些解决方法,但根据我的经验,只要您不打算从其他Java代码中引用它,最简单的方法就是让该死的东西变得可变。 (如果最坏的情况发生,创建一个专用的序列化DTO)

答案 1 :(得分:1)

我怀疑这是因为组合事物的问题。具体来说,您是否可以在不启用Afterburner的情况下尝试您的方法?如果这样做,那么这是Afterburner模块处理处理的一个问题 - 这是可能的,因为这里涉及的代码路径与默认路径不同。 一定要使用最新版本; 2.3.0刚刚发布。