【发布时间】: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