java - 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。
解决方案
应该与 Spring Boot 一起使用的所有选项都不起作用这一事实导致您必须(意外或故意)禁用 MVC 和/或 Jackson 的自动配置的结论。
当您添加具有@EnableWebMvc
大多数与 Web 相关的自动配置的配置类时,将回退并使用 Spring 提供的默认值以及您提供的内容。这也将使这些功能不起作用。
删除该注释并在 中指定属性application.properties
应该足以使其工作。
推荐阅读
- apache-kafka - 如何在代码或 YAML 文件中更改 kafkastore.timeout.ms
- php - 如何从最终用户那里获取浏览器信息和设备信息?
- node.js -
- python - CP求解器可以在特定点初始化吗?
- python - 方法调用解析为对类的函数调用
- javascript - 如何修复“使用 Materialize css 的粘性导航栏”
- javascript - 如何从返回模型的服务中获取类函数
- linux - Powershell 手动运行时可以传输文件,设置为调度程序时无法传输
- java - 如何搜索保存在 MySQL 数据库中的字符串
- node.js - 如何从另一个模型的引用字段中查询一个模型的文档?