2

假设我有一个简单的类 Person

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_MUTATORSfalse.

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

是否有杰克逊方法可以使用 collection.add 方法来初始化集合?

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

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

USE_GETTERS_AS_SETTERS(默认值:true)控制返回 Collection 或 Map 类型的“getter”是否可用于“设置”值(与 JAXB API 处理 XML 的方式相同),因此不需要单独的“setter”方法。即使启用,显式“setter”方法也将优先于隐式 getter-as-setter(如果存在)。

看起来就像我在看的一样,默认情况下它是打开的。那么为什么当时被忽视了呢?

4

2 回答 2

2

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

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

于 2013-11-14T14:08:01.247 回答
1

我怀疑这是由于事物组合的问题。具体来说,您可以在不先启用 Afterburner 的情况下尝试您的方法吗?如果这可行,那么这是 Afterburner 模块处理处理的问题 - 因为此处涉及的代码路径与默认路径不同,所以这是可能的。确保使用最新版本;2.3.0 刚刚发布。

于 2013-11-15T22:19:03.027 回答