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);