我有两个 Jackson 的 ObjectMapper 实例。 (使用v2.8.3)
第一个实例化如下:
ObjectMapper objectMapper = new ObjectMapper();
另一个是通过 @Autowired
从 Spring Boot 上下文 Autowiring 的。
两者具有相同的可见性配置,如下所示:
但是它们为同一对象生成不同的序列化。我意识到的差异如下:
- 序列化字段的顺序
- protected transient 字段的序列化。 ( Autowiring 实例根本不会序列化它们。)
- 序列化字段中的大小写差异,即前者生成“monitoringUserID”,而后者生成“MonitoringUserID”。
我想要的是自动连线映射器也会序列化 protected transient 字段。
如果您能告诉我两个序列化中其他差异的原因,我也会很高兴。
正在序列化的示例类的简化版本:
public class ClauseType implements Serializable {
protected transient List<ClauseTypeNoteItem> noteItems;
public ClauseType() {
}
public List<ClauseTypeNoteItem> getNoteItems() {
...
}
public void setNoteItems(List<ClauseTypeNoteItem> value) {
...
}
}
完整的 ClauseType 类:https://pastebin.com/m3h1hesn
完整的 ClauseTypeNoteItem 类:https://pastebin.com/dmphNV4e
编辑: 我意识到这两个实例都有不同的映射器功能。根据文档,启用 Autowiring 实例的 DEFAULT_VIEW_INCLUSION 功能后,它们具有相同的映射器功能,表示为 1068991。但是差异仍然存在。我还意识到 Autowiring 映射器有两个注册模块:org.springframework.boot.jackson.JsonComponentModule 和 com.fasterxml.jackson.datatype.joda.JodaModule。我不确定第二个模块是否对我得到的结果有影响。
提前致谢。
最佳答案
事实证明,Spring 注入(inject)了来自 jackson-module-jaxb-annotations
maven 依赖项的 JaxbAnnotationIntrospector
。在 BeanDescription 实例化期间,Jaxb 内省(introspection)器会覆盖我提供的可见性检查器设置。因此,作为解决方案,我将注入(inject)一个新的 ObjectMapper
bean 并将其标记为 @Primary
。
如果您想到其他更好的解决方案,请告诉我
关于java - 两个 Jackson ObjectMapper 生成不同的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138970/