正如我所知,Spring已经为Jackson ObjectMapper
提供了bean。因此,我没有创建一个新的bean,而是尝试自定义此bean。
来自此博客文章,然后是这个GitHub项目,我使用Jackson2ObjectMapperBuilder
BEAN实现此自定义。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
然后,我试图自定义避难所以使其宽大:如果在属性化属性时提高了例外,我希望结果对象的属性为 null
并让避免序列继续(默认值继续失败无法进行的属性(。
我已经能够通过扩展DeserializationProblemHandler
的类NullableFieldsDeserializationProblemHandler
来实现这一点(我认为代码不相关,但是如果需要,我可以共享(。
注册此处理程序的最简单方法是使用ObjectMapper
的.addHandler()
方法。但是,当然,这样做时,我需要设置每次注射并使用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());
}
}
但是该解决方案的问题是,似乎我仍然可以访问尚未注册问题处理程序的自动 ObjectMapper
(我可以在需要调试模式下需要它后看到它发生了(。
知道我应该如何注册此处理程序?我注意到Jackson2ObjectMapperBuilder
具有.handlerInstantiator()
,但我不知道如何使用它。
NOTE 我还尝试了Jackson2ObjectMmapperBuilderCustomizer,因为我使用的是Spring Boot,但没有更好的结果。
不可能通过Jackson2ObjectMapperBuilder
或Jackson2ObjectMapperBuilderCustomizer
直接向ObjectMapper
添加DeserializationProblemHandler
。handlerInstanciator()
方法适用于其他东西。
但是,可以通过注册杰克逊模块来做到这一点:
- 构建器具有
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());
}
}
这样写一个bean怎么办:
@Configuration
public class ObjectMapperConfiguration {
@Bean
ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// jackson 1.9 and before
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// or jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
}
这是用于全局配置的。如果您想做的是为特定的一类配置功能,请在类定义上使用此注释:
@JsonIgnoreProperties(ignoreUnknown = true)