Spring 使用 Jackson 全局设置 JsonAutoDetect

Spring with Jackson set JsonAutoDetect globally

在我的 spring 引导 Web 应用程序中,当我从请求映射的函数 return 时,我想将许多不同的 class 序列化为 JSON。这些 classes 仅包含没有 getter 的私有字段。为了让 Jackson 序列化这些私有字段,我可以使用以下注释对所有这些 classes 进行注释,这完全符合预期。

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

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

将使用的 application.properties 中的字段可见性设置为任意。

spring.jackson.visibility.field=ANY

在主 class 中使用 @Bean 自定义 ObjectMapper

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

在主 class 中使用 @Bean 自定义 Jackson2ObjectMapperBuilder

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

使用配置 class 配置 Jackson2ObjectMapperBuilder

@Configuration
public class ObjectMapperConfig implements Jackson2ObjectMapperBuilderCustomizer {

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

但是 none 这些方法对我有用。如果我在我想序列化的每个 class 上使用 @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]

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

所有应该与 Spring 引导一起使用的选项都不起作用这一事实导致您必须(无意或故意)禁用 MVC 的自动配置 and/or杰克逊.

当您使用 @EnableWebMvc 添加配置 class 时,大多数与 Web 相关的自动配置将退避并使用 Spring 提供的默认值和您提供的配置。这也将使这些功能无法正常工作。

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