Spring MVC中如何为JSON RequestBody配置全局Date自定义反序列化器?
Spring MVC 全局配置Date对象RequestBody反序列化
如果你想统一控制所有含Date属性对象的RequestBody反序列化逻辑,无需在每个字段上标注@JsonDeserialize,可以通过以下几种方式实现:
方法一:自定义Jackson配置类
通过配置Jackson2ObjectMapperBuilder来全局注入自定义反序列化规则:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.deser.std.DateDeserializers; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @Configuration public class JacksonGlobalConfig { @Bean public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); // 方式1:指定全局统一日期格式 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); builder.dateFormat(dateFormat); // 方式2:自定义复杂反序列化逻辑(比如支持多格式解析) SimpleModule dateModule = new SimpleModule(); dateModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer() { @Override protected Date _parseDate(String dateStr, com.fasterxml.jackson.databind.DeserializationContext ctxt) throws ParseException { // 先尝试解析带时分秒的格式 try { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr); } catch (ParseException e) { // 失败则尝试解析仅日期的格式 try { return new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); } catch (ParseException ex) { // 最终 fallback 到默认解析逻辑 return super._parseDate(dateStr, ctxt); } } } }); builder.modules(dateModule); // 可选:关闭未知属性抛出异常的特性 builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); return builder; } }
方法二:配置WebMvc消息转换器
通过实现WebMvcConfigurer,自定义MappingJackson2HttpMessageConverter并注入全局消息转换器列表:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.deser.std.DateDeserializers; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @Configuration public class WebMvcGlobalConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); // 注册自定义Date反序列化器 SimpleModule dateModule = new SimpleModule(); dateModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer() { @Override protected Date _parseDate(String dateStr, com.fasterxml.jackson.databind.DeserializationContext ctxt) throws ParseException { if (dateStr.contains(":")) { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr); } else { return new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); } } }); objectMapper.registerModule(dateModule); // 也可以直接设置全局固定日期格式 // objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); jacksonConverter.setObjectMapper(objectMapper); // 将自定义转换器放在列表首位,确保优先使用 converters.add(0, jacksonConverter); } }
方法三:配置文件快速指定格式(仅简单场景)
如果仅需要统一固定的日期格式,无需复杂解析逻辑,直接在配置文件中设置即可:
application.properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
application.yml
spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
注意事项
- 配置优先级:自定义配置类 > 配置文件设置,若同时存在,配置类的规则会覆盖配置文件。
- 异常处理:自定义反序列化器时,建议做好异常兜底,避免因格式不匹配导致请求直接报错。
- Java 8日期类型:若项目使用
LocalDate/LocalDateTime等Java 8新日期类型,需额外引入jackson-datatype-jsr310依赖,并配置对应的序列化/反序列化规则。
内容的提问来源于stack exchange,提问作者Tobia
相关产品推荐
相关产品推荐

