【发布时间】:2018-10-12 19:39:15
【问题描述】:
我有两个 Jackson 的 ObjectMapper 实例。 (使用 v2.8.3)
第一个实例化如下:
ObjectMapper objectMapper = new ObjectMapper();
另一个是通过 @Autowired 从 Spring Boot 上下文自动装配的。
两者具有相同的可见性配置,如下所示:
但是它们为同一个对象产生不同的序列化。我意识到的差异如下:
- 序列化字段的顺序
- 受保护瞬态字段的序列化。 (自动装配的实例根本不序列化它们。)
- 序列化字段的大小写差异,即前者生成“monitoringUserID”,而后者生成“MonitoringUserID”。
我想要的是自动连接的映射器也会序列化受保护的瞬态字段。
如果你能告诉我这两个序列化的其他差异的原因,我也很高兴。
正在序列化的示例类的简化版本:
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
编辑:
我意识到这两个实例都有不同的映射器功能。根据文档,在启用自动装配实例的DEFAULT_VIEW_INCLUSION 功能后,它们具有相同的映射器功能,表示为 1068991。但是差异仍然存在。我还意识到自动连线映射器有两个注册模块:org.springframework.boot.jackson.JsonComponentModule 和 com.fasterxml.jackson.datatype.joda.JodaModule。我不确定第二个模块是否对我得到的结果有影响。
提前致谢。
【问题讨论】:
-
能否请您显示您正在序列化的课程。因为对我来说,他们都只序列化公共字段。
-
@RuslanAkhundov 刚刚更新了帖子
-
Spring Boot docs 明确表示 Spring 提供的默认 Jackson 映射器具有一些开箱即用的自定义属性。你能把它缩小到这些差异吗?
-
是的,两种设置中的 DEFAULT_VIEW_INCLUSION 功能都不同。但是即使启用它,我仍然有不同的结果。请查看我的编辑。
标签: java spring spring-boot jackson2