Spring Jackson 自定义解串器未调用

Spring Jackson custom Deserializer does not called

我有一个 Spring 项目,我尝试添加一个自定义反序列化器来反序列化 Date 属性,具体取决于它们的格式。 如果我将它用作 Date 属性 上的注释,它可以正常工作。 但是如果我将反序列化器添加到我的对象映射器,它不会在 Jackson 反序列化日期时调用。

我尝试像这样应用我的自定义解串器:

    @Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(Date.class, new DateDeserializer());
    mapper.registerModule(module);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
    mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
    mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
    return mapper;
}

我不想每次都在 Date 属性上应用注释,我想默认使用这个反序列化器。 我做错了什么?

鉴于如果您在 属性 日期的注释中使用反序列化器,那么我会说此 ObjectMapper 未用于反序列化。请尝试以下操作:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
   MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
   jsonConverter.setObjectMapper(objectMapper);
   return jsonConverter;
}

我怀疑你是如何尝试在你的应用程序中使用这个 ObjectMapper bean 的。

我相信您已经知道需要在 Configuration class 中创建此 bean。如果不是,您的 bean 将不会在上下文中注册。例如,

@Configuration
public class MapperConfig {
    
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Date.class, new DateDeserializer());
        mapper.registerModule(module);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
        mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
        mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
        return mapper;
    }
}

第二个问题可能是您如何尝试使用这个 ObjectMapper bean。如果您像这样 ObjectMapper objectMapper = new ObjectMapper(); 创建 ObjectMapper 的新实例,该实例将没有您的自定义反序列化器和其他东西。您可以做的是 @Autowire 您已经创建的 ObjectMapper 实例。

感谢大家的帮助。 最后我在 spring.io.

找到了答案
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.deserializerByType(Date.class, new DateDeserializer());
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
   }
}