You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

注意事项

  1. 配置优先级:自定义配置类 > 配置文件设置,若同时存在,配置类的规则会覆盖配置文件。
  2. 异常处理:自定义反序列化器时,建议做好异常兜底,避免因格式不匹配导致请求直接报错。
  3. Java 8日期类型:若项目使用LocalDate/LocalDateTime等Java 8新日期类型,需额外引入jackson-datatype-jsr310依赖,并配置对应的序列化/反序列化规则。

内容的提问来源于stack exchange,提问作者Tobia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:45:02