【问题标题】:Jackson2ObjectMapperBuilder enable field visibility ANYJackson2ObjectMapperBuilder 启用字段可见性 ANY
【发布时间】:2015-06-30 17:16:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring jackson spring-boot


    【解决方案1】:

    您可以使用覆盖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);
            }
    
        };
    
    }
    

    【讨论】:

    • 应用程序无法从 boot 1.4.0 和这个 Caused by: java.lang.NullPointerException: null at org.springframework.data.rest.core.UriToEntityConverter.<init>(UriToEntityConverter.java:71) ~[spring-data-rest-core-2.5.2.RELEASE.jar:na] 启动
    • 查看之前的行...PersistentEntity<?, ?> entity = entities.getPersistentEntity(rawType); 其中rawTypeJsonDeserializer...
    • 这似乎只是将Jackson2ObjectMapperBuilder定义为子类的结果
    • 此方法将禁用在原始Jackson2ObjectMapperBuilder bean 方法中应用的任何Jackson2ObjectMapperBuilderCustomizer bean (JacksonAutoConfiguration.java)
    【解决方案2】:

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

    您可以这样做:

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

    【讨论】:

    【解决方案3】:

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

    • 我在简单的@Configuration 带注释的配置类中配置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?

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2017-06-19
      • 2013-05-28
      • 2013-09-07
      • 2022-01-25
      相关资源
      最近更新 更多