Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson收藏反序列化的最佳实践_Java_Json_Jackson_Mutators - Fatal编程技术网

Java Jackson收藏反序列化的最佳实践

Java Jackson收藏反序列化的最佳实践,java,json,jackson,mutators,Java,Json,Jackson,Mutators,假设我有一个简单的班级成员 public class Person{ final List<String> names= Lists.newArrayList(); public List<String> getNames(){ return names; } } 由于访问错误(键入java.lang.IllegalAccessError… 这是因为final名称列表。要解决此问题,我将MapperFeature.ALLOW\u final\u F

假设我有一个简单的班级成员

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

  public List<String> getNames(){
    return names;
  }
}
由于访问错误(键入java.lang.IllegalAccessError…

这是因为final名称列表。要解决此问题,我将
MapperFeature.ALLOW\u final\u FIELDS\u AS\u MUTATORS
设置为
false

这是正确的解决方案,还是仅仅为了让列表成为非最终列表更好

是否有用于集合的Jackson方法。是否添加用于初始化集合的方法

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

编辑:我现在找到了此设置:

使用\u GETTERS\u作为\u SETTERS(默认值:true)控制“GETTERS”是否 返回集合或映射类型可用于“设置”值(相同 正如JAXB API如何处理XML一样),因此需要使用单独的“setter”方法 不需要。即使启用,显式的“setter”方法也将 优先于隐式getter作为setter(如果存在)


这似乎正是我所看到的,默认情况下它是打开的。那么为什么它会被忽略呢?

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


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

我怀疑这是由于事物组合的问题造成的。具体来说,您能否在不首先启用加力燃烧室的情况下尝试您的方法?如果这样做有效,则这是加力燃烧室模块处理处理过程中的一个问题——这是可能的,因为此处涉及的代码路径与默认路径不同。
请确保使用最新版本;2.3.0刚刚发布。

是的,我大体上同意。但这是专门针对集合字段和Jackson的。为了消除任何空集合字段的可能性,我只需在初始化器中创建它们并将其设置为最终值。您可以始终通过集合的add方法向其添加元素。因此,集合状态为mu表,但不是它本身。我想知道的是,是否有办法让Jackson使用这些add方法来初始化集合。是的,它在没有加力燃烧的情况下工作。但有加力燃烧的情况下,我得到了非法的AccessError,还有最新的版本。然后我必须启用ALLOW_FINAL_FIELDS_as_MUTATORS,让它与加力燃烧一起工作,这很奇怪,因为我不知道“我不知道其含义。这似乎是加力燃烧中的一个bug。根据文档,它应该向集合中添加元素,而不是更改它。我会为加力燃烧提交一个bug;这很可能很容易修复。谢谢,@Staxman,已经报告了一个bug。我只是不确定这是否是预期的行为。”。
Person l = mapper.readValue(js,Person.class);