在 Spring 环境中配置 Jackson's UnserializationProblemHandler



正如我所知,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,但没有更好的结果。

不可能通过Jackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizer直接向ObjectMapper添加DeserializationProblemHandlerhandlerInstanciator()方法适用于其他东西。

但是,可以通过注册杰克逊模块来做到这一点:

  • 构建器具有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)

相关内容

  • 没有找到相关文章

最新更新