在Spring环境中配置Jackson的DeserializationProblemHandler

时间:2018-02-13 18:55:30

标签: spring spring-boot jackson jackson2 jackson-databind

据我所知,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()); } } (我可以在调试模式下需要它时看到它发生)。

知道如何注册这个处理程序吗?我注意到ObjectMapperJackson2ObjectMapperBuilder,但我无法弄清楚如何使用它。

注意我也尝试使用Jackson2ObjectMapperBuilderCustomizer,因为我使用的是Spring Boot但没有更好的结果。

1 个答案:

答案 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)