假设我有一个简单的类人物
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(如果存在)。
看起来就像我正在寻找的那样,它默认开启。那么为什么它会被忽略呢?
答案 0 :(得分:2)
在应用程序中使用不可变对象是最佳实践,但在(非Java)外部世界的边界上,您通常必须避免使用它们。
在大多数序列化技术中,当对象“表现良好”(可变,根据JavaBeans标准使用getter和setter)时,一切正常。通常有一些解决方法,但根据我的经验,只要您不打算从其他Java代码中引用它,最简单的方法就是让该死的东西变得可变。 (如果最坏的情况发生,创建一个专用的序列化DTO)
答案 1 :(得分:1)
我怀疑这是因为组合事物的问题。具体来说,您是否可以在不启用Afterburner的情况下尝试您的方法?如果这样做,那么这是Afterburner模块处理处理的一个问题 - 这是可能的,因为这里涉及的代码路径与默认路径不同。 一定要使用最新版本; 2.3.0刚刚发布。