Spring Boot中LocalDateTime接收“yyyy-MM-dd HH:mm:ss“格式参数的最佳实践

问题背景

最近在Spring Boot项目中遇到了一个常见的日期时间处理问题:当使用LocalDateTime接收前端传来的"2025-12-04 15:10:42"格式参数时,系统直接返回400错误。然而,如果前端传递"2025-12-04T15:10:42"格式,一切正常。

java 复制代码
// 前端传递的JSON数据:
{
  "analyzeTime": "2025-12-04 15:10:42"
}

// 后端接收的实体类:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime analyzeTime;

// 错误信息:
{
  "code": 400,
  "message": "Http消息不可读异常:您未按照接口要求传递参数"
}
问题分析
  • LocalDateTime默认使用ISO-8601格式:"yyyy-MM-dd'T'HH:mm:ss"
  • 习惯使用:"yyyy-MM-dd HH:mm:ss"(中间是空格而非'T')
  • Spring Boot默认使用Jackson进行JSON序列化和反序列化。Jackson针对Java 8时间类型有专门的模块jackson-datatype-jsr310,但默认使用ISO格式。
  • 错误发生在请求参数绑定阶段,甚至不会进入Controller方法。这是因为Spring框架在处理请求体时,首先会尝试将JSON字符串反序列化为Java对象,如果格式不匹配,直接抛出异常。
解决方法

在yaml中进行如下配置

yaml 复制代码
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

加上全局配置Jackson完美解决问题:

java 复制代码
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @version 1.0.0
 * @auther Knight DLS zhangtao
 * @date 2025年12月4日16:29:12
 */
@Configuration
public class LocalDateTimeConfiguration {
 
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;
 
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
 
            //返回时间数据序列化
            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
            //接收时间数据反序列化
            builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
        };
    }
 
}

PS:我在使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解后,前端传递"2025-12-04 15:10:42"格式仍然报错。跟着网上说的配置Jackson的Java 8时间模块支持也不行。

java 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

后面说什么配置Jackson的JavaTimeModule

java 复制代码
@Configuration
public class JacksonConfig {
    
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        
        // 注册JavaTimeModule才能让@JsonFormat生效
        mapper.registerModule(new JavaTimeModule());
        
        // ❌ 以下配置会覆盖@JsonFormat注解
        // mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        // mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        
        return mapper;
    }
}

我当时直接就配了我上面说的全局配置Jackson,就没有来尝试配置JavaTimeModule了。感兴趣的可以自己试一试。

相关推荐
高频因子挖掘机1 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i9 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡9 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF11 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_11 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi