首页 > 解决方案 > Spring with Jackson 在全球范围内设置 JsonAutoDetect

问题描述

在我的 Spring Boot Web 应用程序中,当我从请求映射的函数返回它们时,我想将许多不同的类序列化为 JSON。这些类只包含没有 getter 的私有字段。为了让 Jackson 序列化这些私有字段,我可以使用以下注释对所有这些类进行注释,这与预期的一样工作得很好。

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

但是因为想以这种方式序列化许多不同的类,所以我想在我的 Spring Boot 应用程序中全局声明它。我尝试了以下方法来实现这一点:

将 used 中的字段可见性设置application.properties为 any。

spring.jackson.visibility.field=ANY

在主类中自定义ObjectMapper使用。@Bean

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}

在主类中自定义Jackson2ObjectMapperBuilder使用。@Bean

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder().visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}

Jackson2ObjectMapperBuilder使用配置类进行配置。

@Configuration
public class ObjectMapperConfig implements Jackson2ObjectMapperBuilderCustomizer {

    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    }
}

但这些方法都不适合我。如果我在要序列化的每个类上使用注释,它工作得非常好@JsonAutoDetect,但是如果我尝试使用其中一个全局实现,我总是会收到以下错误:

WARN 5191 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class my.class.i.would.like.to.Serialize]

我不知道是什么导致了这种行为,或者我是否错过了其他地方的重要内容,但我发现的所有全局方法都不起作用。尽管如此,我仍然不想注释所有单独的类,或者不必在其中定义数千个 getter。

标签: javaspringspring-bootspring-mvcjackson

解决方案


应该与 Spring Boot 一起使用的所有选项都不起作用这一事实导致您必须(意外或故意)禁用 MVC 和/或 Jackson 的自动配置的结论。

当您添加具有@EnableWebMvc大多数与 Web 相关的自动配置的配置类时,将回退并使用 Spring 提供的默认值以及您提供的内容。这也将使这些功能不起作用。

删除该注释并在 中指定属性application.properties应该足以使其工作。


推荐阅读