Jackson2ObjectMapperBuilder 启用任何字段可见性

Jackson2ObjectMapperBuilder enable field visibility ANY

我正在使用 spring-boot 并希望自定义创建的 ObjectMapper。

我想要做的是能够序列化没有 getter 或 setter 的对象。在此之前,可以通过将 JsonAutoDetect.Visibility.ANY 放在 ObjectMapper 上来完成。

但是如何使用我当前公开的 Jackson2ObjectMapperBuilder bean 启用此功能?

您可以使用覆盖 configure(ObjectMapper) 方法的 Jackson2ObjectMapperBuilder 子类:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder() {

        @Override
        public void configure(ObjectMapper objectMapper) {
            super.configure(objectMapper);
            objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        }

    };

}

如果您想通过 spring.jackson.* Boot 提供的属性保持 ObjectMapper 的可配置性,那么您最好不要定义自己的 Jackson2ObjectMapperBuilder bean(检查 JacksonAutoConfiguration 中的 JacksonObjectMapperBuilderConfiguration class 了解详情)。

你可以做的是:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder mapperBuilder) {
    return mapperBuilder.build().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
}

我花了半天时间玩不同的设置。 所以我设法在 (1.3.2.RELEASE) 时工作​​:

  • 我在简单的 @Configuration 注释配置 class 中配置 jackson(未从 WebMvcConfigurerAdapter 扩展)
  • 我没有@EnableWebMvc

那么Jackson2ObjectMapperBuilder objectMapperBuilder解决方法是 工作,但 spring.jackson.serialization.indent_output: true 在属性中被忽略。

我终于完成了

 @Autowired(required = true)
 public void configeJackson(ObjectMapper objectMapper) {
     objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
 }

但这一切对我来说都是个谜。我写了一个关于所有这些魔法的任何解释的问题,以便有一些理解和解决问题,而不是通过 试错法:Are there any Spring Boot documentation for understanding how web mvc configuration is work?