mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10mobile wallpaper 11mobile wallpaper 12
424 字
1 分钟
FastJson日期类无法解析的解决方案
2025-08-01

一、问题简述#

<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.36</version>
</dependency>

当我们引入阿里的依赖时,在实体类的日期字段上加了注释指定了日期格式,但在前端传入数据后却报错:

2025-08-01T17:04:24.402+08:00  WARN 864 --- [io-10044-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.Yilena.Coupon.framework.result.Result<java.lang.Void> com.Yilena.MyOneCoupon.merchantAdmin.controller.CouponTemplateController.createCouponTemplate(com.Yilena.MyOneCoupon.merchantAdmin.entry.DTO.request.CouponTemplateSaveReqDTO) with 2 errors: [Field error in object ‘couponTemplateSaveReqDTO’ on field ‘validEndTime’: rejected value [2025-07-08 12:00:00]; codes [typeMismatch.couponTemplateSaveReqDTO.validEndTime,typeMismatch.validEndTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [couponTemplateSaveReqDTO.validEndTime,validEndTime]; arguments []; default message [validEndTime]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘validEndTime’; Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.annotation.JsonFormat @io.swagger.v3.oas.annotations.media.Schema java.util.Date] for value [2025-07-08 12:00:00]]] [Field error in object ‘couponTemplateSaveReqDTO’ on field ‘validStartTime’: rejected value [2024-07-08 12:00:00]; codes [typeMismatch.couponTemplateSaveReqDTO.validStartTime,typeMismatch.validStartTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [couponTemplateSaveReqDTO.validStartTime,validStartTime]; arguments []; default message [validStartTime]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘validStartTime’; Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.annotation.JsonFormat @io.swagger.v3.oas.annotations.media.Schema java.util.Date] for value [2024-07-08 12:00:00]]] ]  

报错很长,但仔细看一下就会发现是日期的格式解析失败,也就是日期格式期望不一致,让我们看看的对应字段的代码:

@Schema(description = "有效期开始时间",
example = "2024-07-08 12:00:00",
required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date validStartTime;

可以看到指定的格式和传入的格式是一样的,那为什么会报错呢?

这里其实是 MVC的默认日期转化器将FastJson给覆盖了,底层是将非Json请求体和Json请求体的转换给分隔开的。

二、#

(一)添加指定Spring底层转化器的解析格式#

在字段上加上**@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”)**注释即可。

(二)配置全局日期#

package com.Yilena.MyOneCoupon.merchantAdmin.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 配置日期转换器的类
* 用于统一日期格式的解析和格式化
*/
@Configuration
public class DateConverterConfiguration implements WebMvcConfigurer {
/**
* 向FormatterRegistry中添加日期格式的转换器
* 这样可以全局配置日期格式的解析和格式化方式
*/
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldType(Date.class, new DateFormatter());
}
/**
* 日期格式转换器类
* 用于将日期字符串转换为Date对象,或将Date对象转换为日期字符串
* 格式为"yyyy-MM-dd HH:mm:ss",时区为GMT+8
*/
static class DateFormatter implements org.springframework.format.Formatter<Date> {
private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 将日期字符串解析为Date对象
* 在解析过程中设置时区为GMT+8,以确保时间的正确性
*/
@Override
public Date parse(String text, java.util.Locale locale) throws java.text.ParseException {
format.setTimeZone(java.util.TimeZone.getTimeZone("GMT+8"));
return format.parse(text);
}
/**
* 将Date对象格式化为日期字符串
* 在格式化过程中设置时区为GMT+8,以确保时间的正确性
*/
@Override
public String print(Date object, java.util.Locale locale) {
format.setTimeZone(java.util.TimeZone.getTimeZone("GMT+8"));
return format.format(object);
}
}
}

如果只有部分字段需要特殊格式则推荐采用方案一,反之方案二。


如果还有问题,请在评论区告诉我!


原文链接: FastJson日期类无法解析的解决方案 作者: Yilena

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

FastJson日期类无法解析的解决方案
https://blog.csdn.net/2401_88959292/article/details/149837897?spm=1001.2014.3001.5501
作者
Yilena
发布于
2025-08-01
许可协议
CC BY 4.0

部分信息可能已经过时

相关文章 智能推荐
1
通过mysqldump进行数据迁移时权限不足的解决方案
故障排查 本文针对使用mysqldump进行MySQL数据迁移时遇到的“Access denied”权限不足报错(错误码1227)提供了有效的解决方案。通过分析报错日志,指出问题根源在于导出的SQL文件中包含了与GTID(全局事务标识)相关的语句,而逻辑导入通常无需参与GTID复制链路。文章给出了在生成SQL文件时添加`--set-gtid-purged=OFF`参数的解决办法,并额外提醒了DataGrip默认勾选`lock tables`可能导致的业务阻塞风险,建议在InnoDB引擎下使用`--single-transaction`以获取一致性快照,确保迁移过程平稳安全。
2
Docker部署的xxl-job执行本地任务时无法连接执行器的解决方案
故障排查 本文针对使用Docker部署xxl-job并调度宿主机本地任务时出现的“无法连接执行器”及连接超时问题,进行了深入的原因分析与解决。指出问题根源在于Docker默认创建的虚拟网卡导致跨网段不可达,使得自动注册的执行器IP无法被外部访问。文章提供了两种切实可行的解决方案:一是手动将执行器IP配置为宿主机的公网可路由地址;二是在启动Docker容器时通过`--network=host`参数指定网络命名空间,使容器共享宿主机网段,从而彻底解决网络隔离带来的调度失败问题。
3
Knife4j未配置却需要登录认证的解决方案
故障排查 本文针对在Spring Boot项目中使用Knife4j时,未配置登录认证却意外弹出登录页面的问题提供了解决方案。通过排查发现,该登录拦截并非来自Knife4j自身配置,而是由项目中引入的Spring Security框架触发。文章给出了两种解决思路:一是直接移除不必要的Spring Security依赖;二是在保留Security框架的前提下,通过配置`SecurityFilterChain`,将Knife4j的核心资源路径(如`/doc.html`、`/v3/api-docs/**`等)加入白名单予以放行,从而完美解决接口文档访问受限的问题。
4
有关IDEA中Lombok失效、找不到符号问题的解决方案
故障排查 本文针对在IDEA中使用Lombok时遇到的注解失效及编译时"找不到符号"的常见问题,提供了切实有效的解决方案。作者通过实践发现,问题的根源往往在于未明确指定Lombok依赖的版本。文章详细列出了需要在pom.xml中指定Lombok版本号(如1.18.30)的三个关键位置:依赖声明、maven-compiler-plugin的annotationProcessorPaths配置以及excludes配置。此外,还补充了在Spring Boot父工程环境下,通过pluginManagement统一配置编译插件以彻底解决该问题的进阶方法。
5
Sharding-JDBC 定时任务 SQL 无响应的解决方案
故障排查 本文针对在使用Sharding-JDBC进行分库分表时,定时任务中SQL执行无响应且无明显报错的问题进行了深度排查与解决。通过调整日志级别,发现问题根源在于Spring定时任务默认使用的`ScheduledThreadPoolExecutor`线程池未自动设置上下文类加载器,导致Sharding-JDBC在初始化配置时抛出空指针异常并阻塞线程。文章给出了简洁有效的解决方案:在定时任务执行逻辑起始处,通过`Thread.currentThread().setContextClassLoader()`显式设置当前类的类加载器,从而成功恢复Sharding-JDBC的正常运行与SQL输出。

目录

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00