据我所知,Spring已经为杰克逊ObjectMapper
提供了一个豆子。因此,我不是创建一个新bean,而是尝试自定义这个bean。
从此blog post开始,然后使用Github project我使用Jackson2ObjectMapperBuilder
bean来实现此自定义。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
然后,我试图自定义反序列化器以使其宽松:如果在反序列化属性时引发异常,我希望结果对象的属性为null
并让反序列化继续(默认为在第一个无法反序列化的属性上失败。)
我已经能够通过扩展NullableFieldsDeserializationProblemHandler
的类DeserializationProblemHandler
实现这一目标(我不认为代码是相关的,但如果需要,我可以分享它。)
注册此处理程序的最简单方法是使用.addHandler()
的{{1}}方法。但是,当然,这样做,我需要在每次注入和使用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());
}
}
(我可以在调试模式下需要它时看到它发生)。
知道如何注册这个处理程序吗?我注意到ObjectMapper
有Jackson2ObjectMapperBuilder
,但我无法弄清楚如何使用它。
注意我也尝试使用Jackson2ObjectMapperBuilderCustomizer,因为我使用的是Spring Boot但没有更好的结果。
答案 0 :(得分:1)
写这样的豆怎么样:
@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)