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()));
}
}
我有一个 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()));
}
}