【问题标题】:Spring with Jackson set JsonAutoDetect globallySpring with Jackson 在全球范围内设置 JsonAutoDetect
【发布时间】:2021-11-23 05:31:59
【问题描述】:

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

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

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

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

spring.jackson.visibility.field=ANY

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

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

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

@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。

【问题讨论】:

  • 猜想你的某个配置类中有@EnableWebMvc,它会禁用 MVC 的自动配置,即 Spring Boot 中的 Jackson。
  • 再查了一下,果然是这样。谢谢,请随时写一个答案,以便我接受。

标签: java spring spring-boot spring-mvc jackson


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 2017-01-03
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多