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

标签 java spring spring-boot jackson2

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

第一个实例化如下:

ObjectMapper objectMapper = new ObjectMapper();

另一个是通过 @Autowired 从 Spring Boot 上下文 Autowiring 的。

两者具有相同的可见性配置,如下所示:

enter image description here

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

  • 序列化字段的顺序
  • 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/

相关文章:

java - 在 'src' 为 maven-jaxb2-plugin 生成文件

java - 如何使用 Android Studio 中的 Activity 而不是 Fragment 更改 BottomNavigationView 中所选图标的颜色?

java - 在不同项目中用作已编译的 jar 时,Spring AOP 不起作用

java - OriginalDestination 可以用作死信队列使用者的选择器吗?

java - Spring Boot Oauth2 注销端点

spring-boot - flyway 是否支持 test 文件夹下的 sql 迁移?

Java编码风格,局部变量与重复方法调用

java - 根据 var 名称,该方法在 Java 中输出一些内容

android - 从android http登录到grails 3 spring安全

java - Spring Boot JPA 基本配置优先于应用程序配置