<分区>
据我了解,Spring 已经为 Jackson ObjectMapper
提供了一个 bean。因此,我没有创建新的 bean,而是尝试自定义这个 bean。
从这里blog post ,然后是这个 Github project我使用 Jackson2ObjectMapperBuilder
bean 来实现这种定制。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
然后,我试图自定义反序列化器以使其宽松:如果在反序列化属性时引发异常,我希望结果对象的属性为 null
并让反序列化继续(默认是在无法反序列化的第一个属性上失败)。
我已经能够通过扩展 DeserializationProblemHandler
的类 NullableFieldsDeserializationProblemHandler
实现这一点(我认为代码不相关,但如果需要,我可以分享它) .
注册此处理程序的最简单方法是使用ObjectMapper
的.addHandler()
方法。但是,当然,这样做,我需要在每次注入(inject)和使用 ObjectMapper
时进行设置。我希望能够配置处理程序,以便每次 ObjectMapper
自动连接时,处理程序已经存在。
到目前为止,我想到的最佳解决方案是仅使用 @PostConstruct
注释来注册问题处理程序。
@Configuration
public class JacksonConfiguration implements InitializingBean {
@Autowired private ObjectMapper objectMapper;
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
@Override
public void afterPropertiesSet() {
objectMapper.addHandler(new NullableFieldsDeserializationProblemHandler());
}
}
但这个解决方案的问题是,我似乎仍然可以访问一个尚未注册问题处理程序的 Autowiring ObjectMapper
(我可以在调试中需要它时看到它发生模式)。
知道我应该如何注册这个处理程序吗?我注意到 Jackson2ObjectMapperBuilder
有一个 .handlerInstantiator()
但我不知道如何使用它。
注意 我也试过 Jackson2ObjectMapperBuilderCustomizer因为我使用的是 Spring Boot 但没有更好的结果。