客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题
客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题
- 问题演示
- 第1种:客户端以URL拼接的方式传值
- 第2种:客户端以body中的form-data方式提交
- 第3种 客户端以Body中的json方式提交
- 问题解决(全局解决方式)
- 针对 第1和第2种情况
- 解决办法
- 验证
- 针对第3中情况
- 解决办法
- 验证
问题演示
- 演示代码
服务端接口代码
@PostMapping("/binder")@ResponseBodypublic String binderTest(TestEntity te) {return te.getBirthDay().toString() ;}
以上接口中的实体TestEntity
import java.util.Date;import org.springframework.format.annotation.DateTimeFormat;import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;@Data
public class TestEntity {private String name;private String addr;private Date birthDay;
}
TestEntity中的字段birthDay为Date类型
客户端演示使用PostMan
第1种:客户端以URL拼接的方式传值

后台报错:
Field error in object 'testEntity' on field 'birthDay': rejected value [2024-02-09 22:22:33]; codes
[typeMismatch.testEntity.birthDay,typeMismatch.birthDay,typeMismatch.java.util.Date,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes
[testEntity.birthDay,birthDay]; arguments []; default message [birthDay]]; default message [Failed to convert
property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthDay'; nested exception
is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String]
to type [java.util.Date] for value '2024-02-09 22:22:33'; nested exception is
java.lang.IllegalArgumentException]]
第2种:客户端以body中的form-data方式提交

后台报错:
Field error in object 'testEntity' on field 'birthDay': rejected value [2024-02-07]; codes
[typeMismatch.testEntity.birthDay,typeMismatch.birthDay,typeMismatch.java.util.Date,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes
[testEntity.birthDay,birthDay]; arguments []; default message [birthDay]]; default message [Failed to convert
property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthDay'; nested exception
is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String]
to type [java.util.Date] for value '2024-02-07'; nested exception is java.lang.IllegalArgumentException]]
第3种 客户端以Body中的json方式提交
这里需要先在接口中,添加注解@RequestBody,接口变成如下:
@PostMapping("/binder")@ResponseBodypublic String binderTest(@RequestBody TestEntity te) {return te.getBirthDay().toString() ;}

以上日期格式是 yyyy-MM-dd (2024-06-08),可以成功!
但是,将格式变成yyyy-MM-dd HH:mm:ss,就不行了,见如下:

后台报错:
JSON parse error: Cannot deserialize value of type `java.util.Date` from String "2024-06-08 22:11:33": not a
valid representation (error: Failed to parse Date value '2024-06-08 22:11:33': Cannot parse date "2024-06-08
22:11:33": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSX', parsing fails (leniency? null)); nested
exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type
`java.util.Date` from String "2024-06-08 22:11:33": not a valid representation (error: Failed to parse Date value
'2024-06-08 22:11:33': Cannot parse date "2024-06-08 22:11:33": while it seems to fit format 'yyyy-MM-
dd'T'HH:mm:ss.SSSX', parsing fails (leniency? null))at [Source: (PushbackInputStream); line: 2, column: 16] (through reference chain:
问题解决(全局解决方式)
针对 第1和第2种情况
解决办法
新增日期转换类,并将其纳入到spring的bean管理中:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;import org.springframework.core.convert.converter.Converter;/*** 日期格式转换类,* * 仅针对当客户端是以下两种方式日期格式值的转换* * 1.url地址拼接的方式,形如:localhost:8031/binder?birthDay=2024-02-09 22:22:33。* * 2.body方式中的form-data方式!* * 注意!!!与DateJacksonConverter类区别。* * @author Administrator*/
public class MyDateConverter implements Converter<String, Date> {// TODO 2024年4月12日16:01:01// 完善—日期格式有多种这里只列举了一种,根据传入的String格式日期分别初始化SimpleDateFormat,还有如下格式需要处理://private static String[] pattern = new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss",// "yyyy-MM-dd HH:mm:ss.S", "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S",// "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S" };SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Date convert(String s) {Date date = null;try {date = sdf.parse(s);} catch (ParseException e) {throw new RuntimeException(e);}return date;}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import com.fasterxml.jackson.databind.ObjectMapper;/*** 配置数据绑定* * @author Administrator**/
@Configuration
public class MyConfigurableWebBindingInitializer {/*** 仅针对当客户端是以下两种方式日期格式值的转换* 1.url地址拼接的方式,形如:localhost:8031/binder?birthDay=2024-02-09 22:22:33。* 2.body方式中的form-data方式!* * @return*/@Beanpublic MyDateConverter myDateConverter() {return new MyDateConverter();}
}
验证


均成功!
针对第3中情况
解决办法
同样,新增日期转换类,并将其纳入到spring的bean管理中:
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.time.DateUtils;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;/*** 日期格式转化类:* * 针对客户端传值方式为 body中的json方式* * 注意!!!与MyDateConverter类区别。* * @author Administrator* * https://www.jianshu.com/p/c97a20fc9a35**/
public class DateJacksonConverter extends JsonDeserializer<Date> {private static String[] pattern = new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm:ss.S", "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S","yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S" };@Overridepublic Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {Date targetDate = null;String originDate = p.getText();if (StringUtils.isNotEmpty(originDate)) {try {long longDate = Long.valueOf(originDate.trim());targetDate = new Date(longDate);} catch (NumberFormatException e) {try {targetDate = DateUtils.parseDate(originDate, DateJacksonConverter.pattern);} catch (ParseException pe) {throw new IOException(String.format("'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)",originDate, StringUtils.join(pattern, ",")));}}}return targetDate;}@Overridepublic Class<?> handledType() {return Date.class;}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import com.fasterxml.jackson.databind.ObjectMapper;/*** 配置数据绑定* * @author Administrator**/
@Configuration
public class MyConfigurableWebBindingInitializer {/*** 仅针对当客户端是以下两种方式日期格式值的转换* 1.url地址拼接的方式,形如:localhost:8031/binder?birthDay=2024-02-09 22:22:33。* 2.body方式中的form-data方式!* * @return*/@Beanpublic MyDateConverter myDateConverter() {return new MyDateConverter();}// ======针对客户端传值方式为 body中的json方式:对日期格式进行转换======开始@Beanpublic DateJacksonConverter dateJacksonConverter() {return new DateJacksonConverter();}@Beanpublic Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean(@Autowired DateJacksonConverter dateJacksonConverter) {Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);return jackson2ObjectMapperFactoryBean;}@Beanpublic MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(@Autowired ObjectMapper objectMapper) {MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);return mappingJackson2HttpMessageConverter;}// ======针对客户端传值方式为 body中的json方式======结束}
验证
需给接口加上@RequestBody注解,略。

成功!
相关文章:
客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题
客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题 问题演示第1种:客户端以URL拼接的方式传值第2种:客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决(全局解…...
【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?
一、堆和栈的定义 (1)堆(Heap) 数据结构:堆是一种特殊的完全二叉树,满足父节点的值总是大于或等于(大根堆)其子节点的值。也可以是总是小于或等于(小根堆)其…...
5-云原生监控体系-Grafana-使用配置文件实现自动化导入Dashboard
文章目录 1. 介绍(此文档使用的版本 grafana-enterprise-10.0.3-1)2. 清空之前的实验数据3. 使用配置文件方式配置 Datasource3.1. 创建配置文件3.2. 重启服务并检查是否生效4. 使用配置文件方式配置 Dashboard4.1. 创建配置文件5. 配置 Dashboard JSON 文件5.1. 下载 JSON 文…...
Ollama、FastGPT大模型RAG结合使用案例
参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…...
夯实智慧新能源数据底座,TiDB Serverless 在 Sandisolar+ 的应用实践
本文介绍了 SandiSolar通过 TiDB Serverless 构建智慧新能源数据底座的思路与实践。作为一家致力于为全球提供清洁电力解决方案的新能源企业,SandiSolar面临着处理大量实时数据的挑战。为了应对这一问题,SandiSolar选择了 TiDB Serverless 作为他们的数据…...
MySQL数据库max_allowed_packet参数
如上图所示的报错,我在提交接口的时候出现了这个错误: MySqlConnector.MySqlException:Error submitting 4MB packet;ensure max_allowed_packet is greater than 4MB.在MySQL数据库中,有一个参数叫max_allowed_packet,这个参数会…...
Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露
目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点: 1、云原生-K8s安全-etcd未…...
JUC下面常见的锁
这里写目录标题 1、ReentrantLock2、Semaphore3、CountDownLatch4、CyclicBarrier 1、ReentrantLock ReentrantLock 是属于独占模式, 即同一时刻只允许一个线程获取锁。 2、Semaphore Semaphore 属于共享模式,synchronized 和 ReentrantLock 都是一次只…...
Uniapp+基于百度智能云完成AI视觉功能(附前端思路)
本博客使用uniapp百度智能云图像大模型中的AI视觉API(本文以物体检测为例)完成了一个简单的图像识别页面,调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…...
Android 软件盘的弹出和消失的监听
监听接口 OnKeyboardListener.java public interface OnKeyboardListener {void onKeyboardHidden();void onKeyboardShow(int keyboardHeight);} KeyBoardUtil.java public class KeyBoardUtil {private final static String TAG "KeyBoardUtil";public PopupWi…...
通俗易懂HTTP和HTTPS区别
HTTP:超文本传输协议,它是使用一种明文的方式发送我们的内容,没有任何的加密,例如我们要在网页上输入账号密码,如果使用HTTP协议,账号密码就可能会被暴露,默认端口是80. HTTPS:是HT…...
【ZZULIOJ】1061: 顺序输出各位数字(Java)
目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 输入一个不大于10的9次方的正整数,从高位开始逐位分割并输出各位数字。 输入 输入一个正整数n,n是int型数据 输出 依次输出各位上的数字,每一个数字后面有一个空格…...
java数据结构与算法刷题-----LeetCode260. 只出现一次的数字 III
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 与运算取末尾1分组 与运算取末尾1分组 解题思路:时间…...
AWS被误扣费了,怎么解决?
有时在使用aws时,可能会无意中被AWS扣费,对于如何处理这个问题,作为aws的合作伙伴,接下来由九河云进行讲解: (1)审查账单:首先,您需要仔细审查AWS账单,了解具…...
再传IPO消息,SHEIN的上市为何充满变数?
据《金融时报》援引消息人士报道,SHEIN正在等待北京监管部门的批准,以推进在纽约或伦敦的重磅上市。 几乎每隔一段时间,SHEIN即将上市的消息就会成为媒体关注的焦点,但每一次报道都“没有下文”,再加上SHEIN官方的“拒…...
maven bom
BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。 为什么要使用BOM 使用BOM除…...
若依vue中关于字典的使用
文章目录 字典管理页面列表点击某个字典类型展示具体字典数据修改某一条字典数据 字典的应用一般用于select多选框中代码实现根据字典Dict的value获取Label,类似于通过key获得value 源码解析 字典管理页面 列表 点击某个字典类型展示具体字典数据 修改某一条字典数…...
链表题(哑结点的使用)
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 首先面对删除链表节点的操作,我们通常是将该节点的上一个节点的next指向该节点的下一个节点,从而将这个节点置空,达到删除节点的操作。 但是我们会碰…...
C#:求三个整数的最大值
任务描述 本关任务:编写一个程序,实现从键盘输入的三个整数,输出三个整数的最大值。 编程要求 根据提示,在右侧编辑器补充代码,计算并输出从键盘输入的三个数的最大值。 测试说明 平台会对你编写的代码进行测试&…...
广州南沙番禺联想SR530服务器主板传感器故障维修
今日分享一例广州市南沙区联想ThinkSystem SR530服务器sensor sysbrd vol故障问题维修案例; 服务器型号是:Lenovo thinksystem sr530 g6服务器 服务器所在位置:广东省广州市南沙区 服务器故障问题:机房异常停电,来电后…...
终极指南:Cobalt项目中代理配置的全局应用机制解析
终极指南:Cobalt项目中代理配置的全局应用机制解析 【免费下载链接】cobalt save what you love 项目地址: https://gitcode.com/gh_mirrors/co/cobalt Cobalt是一款强大的开源项目,其核心功能是帮助用户"save what you love"ÿ…...
如何使用Obtainium自定义标签功能:打造个性化应用分类管理系统
如何使用Obtainium自定义标签功能:打造个性化应用分类管理系统 【免费下载链接】Obtainium Get Android App Updates Directly From the Source. 项目地址: https://gitcode.com/GitHub_Trending/ob/Obtainium Obtainium是一款专注于直接从源头获取Android应…...
RexUniNLU中文NLP系统保姆级教程:Gradio输入输出格式与调试技巧
RexUniNLU中文NLP系统保姆级教程:Gradio输入输出格式与调试技巧 1. 开篇:为什么需要这个教程 如果你正在使用或者打算使用RexUniNLU中文NLP系统,可能会遇到这样的困惑:明明模型能力很强,为什么我的输入总是得不到想要…...
图形化界面工具 - webUI使用Page Assist 插件
图形化界面工具 - webUI使用 1、Page Assist 插件下载 安装 Page Assist 插件:本地 AI 模型的 Web UI 界面。 1 - 打开网站 Crx 搜搜:https://www.crxsoso.com 2 - 搜索:Page Assist,下载 crx 安装包 2、插件安装 谷歌浏览器打…...
深入浅出计算机网络基石:详解 OSI 模型、TCP/IP 模型及数据通信全过程
前言大家好,这里是程序员阿亮,今天也是在公司里面当起黑奴了,实习生,大小周,不包饭,吃公司饭还要收钱。。。但是博客还是要写滴今天来给大家讲解一下OSI七层模型和TCP/IP模型这是计算机网络中的基础架构&am…...
Mockito实战:5个Spring Boot单元测试中常见的坑与解决方案
Mockito实战:Spring Boot单元测试中5个高频陷阱与工程化解决方案 在Spring Boot项目中使用Mockito进行单元测试时,即使经验丰富的开发者也会遇到各种"暗坑"。这些陷阱往往导致测试结果与预期不符,甚至引发生产环境才暴露的问题。本…...
Wan2.1-umt5多轮对话效果展示:模拟技术面试与深度调试对话
Wan2.1-umt5多轮对话效果展示:模拟技术面试与深度调试对话 最近在体验各种对话模型时,我特意找了一些需要深度思考和连续逻辑的场景来测试。今天想和大家聊聊Wan2.1-umt5这个模型,重点不是讲怎么部署,而是看看它在面对复杂、多轮…...
实时口罩检测-通用模型评估报告:Precision/Recall/F1-score完整指标
实时口罩检测-通用模型评估报告:Precision/Recall/F1-score完整指标 1. 模型概述与评估背景 实时口罩检测-通用模型是一个基于DAMO-YOLO框架开发的高效目标检测系统,专门用于识别图像中是否佩戴口罩。在当前环境下,这样的检测系统具有重要的…...
Python面向对象编程(OOP)详解:类、对象、继承、多态、封装
面向对象编程(Object-Oriented Programming,简称OOP)是一种主流的编程范式,核心思想是“以对象为中心”,将数据(属性)和操作数据的方法(行为)封装在一起,通过…...
掌握Elixir函数定义:从匿名函数到命名函数的完整指南
掌握Elixir函数定义:从匿名函数到命名函数的完整指南 【免费下载链接】elixir Elixir 是一种用于构建可扩展且易于维护的应用程序的动态函数式编程语言。 项目地址: https://gitcode.com/GitHub_Trending/el/elixir Elixir作为一种动态函数式编程语言&#x…...
