wos*_*pin 4 spring jackson spring-boot jackson2 jackson-databind
据我了解,Spring 已经为 Jackson 提供了一个 bean ObjectMapper。因此,我不是创建一个新的 bean,而是尝试自定义这个 bean。
从这篇博文,然后这个Github项目我使用Jackson2ObjectMapperBuilderbean来实现这个定制。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
Run Code Online (Sandbox Code Playgroud)
然后,我尝试自定义反序列化器以使其宽松:如果在反序列化属性时引发异常,我希望结果对象的属性为并null让反序列化继续(默认值是在第一个不能被序列化的属性上失败)反序列化)。
我已经能够通过NullableFieldsDeserializationProblemHandler扩展的类来实现这一点DeserializationProblemHandler(我认为代码不相关,但如果需要,我可以共享它)。
注册此处理程序的最简单方法是使用.addHandler()的方法ObjectMapper。但当然,这样做,我需要在每次注入和使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
但这个解决方案的问题是,我似乎仍然可以访问ObjectMapper尚未注册问题处理程序的自动装配(我可以在调试模式下需要它时看到它发生)。
知道我应该如何注册这个处理程序吗?我注意到Jackson2ObjectMapperBuilder有一个.handlerInstantiator()但我不知道如何使用它。
注意,因为我使用 Spring Boot,所以我也尝试过使用Jackson2ObjectMapperBuilderCustomizer,但没有更好的结果。
不可能通过 a或直接将 a 添加DeserializationProblemHandler到。该方法是为了别的东西。ObjectMapperJackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizerhandlerInstanciator()
但是,可以通过注册 Jackson 模块来做到这一点:
modules()方法setupModule()一个SetupContext实例进行访问,该实例有一个addDeserializationProblemHandler()方法这有效:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.modules(new MyModule());
}
};
}
private static class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
// Required, as documented in the Javadoc of SimpleModule
super.setupModule(context);
context.addDeserializationProblemHandler(new NullableFieldsDeserializationProblemHandler());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5951 次 |
| 最近记录: |