两个Jackson ObjectMapper生成不同的序列化

时间:2018-05-02 16:04:31

标签: java spring spring-boot jackson2

我有两个Jackson的ObjectMapper实例。 (使用v2.8.3)

第一个实例化如下:

ObjectMapper objectMapper = new ObjectMapper();

另一个是通过@Autowired从Spring Boot上下文自动装配的。

两者都具有相同的可见性配置:

enter image description here

但是它们为同一个对象生成不同的序列化。我意识到的差异如下:

  • 序列化字段的顺序
  • 受保护瞬态场的序列化。 (自动装配的实例根本不会对它们进行序列化。)
  • 序列化字段中的大小写差异,即前者生成" 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。我不确定第二个模块是否会对我得到的结果产生影响。

提前致谢。

2 个答案:

答案 0 :(得分:1)

事实证明,Spring注入来自JaxbAnnotationIntrospector maven依赖关系的jackson-module-jaxb-annotations。在BeanDescription s的实例化期间,Jaxb introspector会覆盖我提供的可见性检查器设置。因此,作为解决方案,我将注入一个新的ObjectMapper bean并将其标记为@Primary

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

答案 1 :(得分:0)

在Spring Boot中,杰克逊server: port: 8888 spring: cloud: config: discovery: enabled: true server: encrypt.enabled: false git: uri: https://git-codecommit.eu-west-2.amazonaws.com/v1/repos/XXXXX username: XXXXXXXXXX password: XXXXXXXXXX ObjectMapper对象构建和定制。配置的主要来源是Jackson2ObjectMapperBuilder属性,如文档中所述: