【问题标题】:Two Jackson ObjectMapper generate different serializations两个 Jackson ObjectMapper 生成不同的序列化
【发布时间】: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.JsonComponentModulecom.fasterxml.jackson.datatype.joda.JodaModule。我不确定第二个模块是否对我得到的结果有影响。

提前致谢。

【问题讨论】:

  • 能否请您显示您正在序列化的课程。因为对我来说,他们都只序列化公共字段。
  • @RuslanAkhundov 刚刚更新了帖子
  • Spring Boot docs 明确表示 Spring 提供的默认 Jackson 映射器具有一些开箱即用的自定义属性。你能把它缩小到这些差异吗?
  • 是的,两种设置中的 DEFAULT_VIEW_INCLUSION 功能都不同。但是即使启用它,我仍然有不同的结果。请查看我的编辑。

标签: java spring spring-boot jackson2


【解决方案1】:

原来,Spring 注入了来自 jackson-module-jaxb-annotations maven 依赖项的 JaxbAnnotationIntrospector。在BeanDescriptions 的实例化过程中,Jaxb 内省器会覆盖我提供的可见性检查器设置。因此,作为解决方案,我将注入一个新的 ObjectMapper bean 并将其标记为 @Primary

如果您有其他更好的解决方案,请告诉我

【讨论】:

    【解决方案2】:

    在 Spring Boot 中,Jackson ObjectMapperJackson2ObjectMapperBuilder 对象构建和自定义。配置的主要来源是文档中解释的spring.jackson.* 属性:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 2014-06-03
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      相关资源
      最近更新 更多