客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题

客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题

  • 问题演示
    • 第1种:客户端以URL拼接的方式传值
    • 第2种:客户端以body中的form-data方式提交
    • 第3种 客户端以Body中的json方式提交
  • 问题解决(全局解决方式)
    • 针对 第1和第2种情况
      • 解决办法
      • 验证
    • 针对第3中情况
      • 解决办法
      • 验证

问题演示

  1. 演示代码

服务端接口代码

	@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注解,略。
在这里插入图片描述
成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

softmax回归:多分类问题的解码器

随着人工智能技术的不断发展&#xff0c;分类问题在机器学习领域中的地位日益凸显。在众多分类算法中&#xff0c;softmax回归以其独特的优势和广泛的应用场景&#xff0c;成为了处理多分类问题的有力工具。本文将深入探讨softmax回归的原理、应用及其优缺点&#xff0c;以期为…

【24届数字IC秋招总结】提前批面试经验1——小米、百度昆仑芯、长鑫存储

文章目录 前言一、小米-SOC验证工程师1.1 面试问题二、百度昆仑芯-芯片验证工程师2.1 一面面试问题2.2 二面面试问题三、长鑫存储-数字电路前言 提前批面试公司:小米、百度昆仑芯、长鑫存储 一、小米-SOC验证工程师 面试时间:7.23 周末 1.1 面试问题 1、 问研究生项目,自…

【Django】必须登陆才能访问功能实现

一、直接使用session传递登录状态(不推荐&#xff0c;但能用) 这是最简单、最直接的方法。 1.登录视图添加标识 添加登录状态标识 request.session[is_logged_in] False def user_login(request):# 这是一个登录状态标识request.session[is_logged_in] Falseif request.…

pytorch-多分类实战之手写数字识别

目录 1. 网络设计2. 代码实现2.1 网络代码2.2 train 3. 完整代码 1. 网络设计 输入是手写数字图片28x28&#xff0c;输出是10个分类0~9&#xff0c;有两个隐藏层&#xff0c;如下图所示&#xff1a; 2. 代码实现 2.1 网络代码 第一层将784降维到200&#xff0c;第二次使用…

oracle表误删恢复

update误更新表恢复&#xff1a; UPDATE sysuser a SET dept(SELECT jjxm FROM z_temp20190313 b WHERE b.sbbma.dept) WHERE useful1 AND dept IS NOT NULL 查询sysuser表最后dml操作时间&#xff1a; select max(ora_rowscn),to_char(scn_to_timestamp(max(ora_rowscn)),y…

以Centos7为例,监控SSD硬盘的I/O性能,分析硬盘的读写数据

监控SSD硬盘的I/O性能可以通过多种工具和命令来实现。在CentOS 7系统中&#xff0c;以下是一些常用的方法来监控SSD的I/O性能&#xff1a; 使用iostat命令&#xff1a; iostat是sysstat包的一部分&#xff0c;可以报告CPU统计信息和所有块设备的I/O统计信息。要安装sysstat包&a…

ChatGPT基础(二) ChatGPT的使用和调优

文章目录 ChatGPT的特性采用关键词进行提问给ChatGPT指定身份提升问答质量的策略1.表述方式上的优化2.用"继续"输出长内容3.营造场景4.由浅入深&#xff0c;提升问题质量5.预设回答框架和风格 ChatGPT的特性 1.能够联系上下文进行回答 ChatGPT回答问题是有上下文的&…

uni-app web端使用getUserMedia,摄像头拍照

<template><view><video id"video"></video></view> </template> 摄像头显示在video标签上 var opts {audio: false,video: true }navigator.mediaDevices.getUserMedia(opts).then((stream)> {video document.querySelec…

【python】在pycharm创建一个新的项目

双击打开pycharm,选择create new project 选择create,后进入项目 右键项目根目录,选择new一个新的python file 随意命名一下 输入p 然后后面就会出现智能补全提示,此时轻敲一下tab,代码就写好了,非常的方便 右键执行一下代码,下面两个直接运行和debug运行都是可以的 小结 …

CentOS 8服务器搭建L2TP服务器(over IPsec)操作指南

正文共&#xff1a;1234 字 14 图&#xff0c;预估阅读时间&#xff1a;2 分钟 之前发过把我自己的服务器搬上公网的文章&#xff08;我用100块钱把物理服务器放到了公网&#xff0c;省了几万块&#xff01;&#xff09;&#xff0c;当时L2TP拨号用的是网络上的解决方案&#x…

微服务整合Spring Cloud Gateway动态路由

前置 创建 Spring Cloud项目 参考&#xff1a;创建Spring Cloud Maven工程-CSDN博客 1. 创建一个maven jar类型项目 在idea中右键父工程-》New-》Module 创建一个maven工程 2. 引入相关依赖 在POM文件中引入下面的依赖 <project xmlns"http://maven.apache.org/P…

IntelliJ IDEA 快捷键和自定义操作详细配置指南

IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),广泛应用于Java、Kotlin、Groovy 等语言的开发中。其丰富的功能和灵活的配置选项使得开发人员能够高效地进行代码编写、调试和项目管理。本文将介绍如何在 IntelliJ IDEA 中快速进行配置并充分发挥其强大功能,使您的开发环…

设计模式学习笔记 - 设计模式与范式 -行为型:14.备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗

概述 上两篇文章&#xff0c;我们学习了访问者模式的原理与实现、以及为什么支持双分派编程语言不需要访问者模式。 本章&#xff0c;学习另外一种行为型模式&#xff0c;备忘录模式。这个模式理解、掌握起来不难&#xff0c;代码实现比较灵活&#xff0c;应用场景也比较明确…

C++设计模式|创建型 1.单例模式

1.什么是单例模式&#xff1f; 单例模式的的核⼼思想在创建类对象的时候保证⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问这个实例。 只有⼀个实例的意思是&#xff0c;在整个应⽤程序中&#xff0c;只存在该类的⼀个实例对象&#xff0c;⽽不是创建多个相同类…

【JAVA基础篇教学】第八篇:Java中List详解说明

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第八篇&#xff1a;Java中List详解说明。 在 Java 编程中&#xff0c;List 接口是一个非常常用的集合接口&#xff0c;它代表了一个有序的集合&#xff0c;可以包含重复的元素。List 接口提供了一系列操作方法&#xff0c;…

72V电瓶电压降5V1.5A恒压WT7039

72V电瓶电压降5V1.5A恒压WT7039 WT6039是一款12V至72V宽电压降压DC-DC转换器芯片&#xff0c;集成了开关控制、参考电源、误差放大器等多重功能&#xff0c;并具备过热、限流和短路保护。它能在广泛输入功率下实现2A连续输出电流&#xff0c;并通过编程调整输出电压。适用于高…

文心一言

文章目录 前言一、首页二、使用总结 前言 今天给大家带来百度的文心一言,它基于百度的文心大模型,是一种全新的生成式人工智能工具。 一、首页 首先要登录才能使用,左侧可以看到以前的聊天历史 3.5的目前免费用,但是4.0的就需要vip了 二、使用 首先在最下方文本框输入你想要搜…

ArrayList,Vector,LinkedList内存解析

1.ArrayList (1). 特点 : 实现了List接口&#xff0c;存储有序的&#xff0c;可重复的数据.底层使用Object[]数组存储.线程不安全.(底层方法未用synchronized修饰.) (2). 版本解析 : <i> : JDK7版本 ArrayList<String> list &#xff1d;new ArrayList<&…

npm问题合集以及npm常规操作整理

问题一&#xff1a;npm install 卡在“sill idealTree buildDeps“ 可以尝试将网络切换为其他网络&#xff0c;我的是这么解决的。可以尝试重新设置镜像。 问题二&#xff1a;npm install 项目依赖报WARN deprecated 原因 依赖版本问题&#xff0c;下载最新版本。 解决方案 …

做多 与 做空 概念解析

坐多&#xff1a;低买高卖 阶段一&#xff1a;借钱->低价时买货>得货 阶段二&#xff1a;高价时卖货 > 得更多的钱 阶段三&#xff1a;还钱 >余钱 多空&#xff1a;高卖低买 阶段一&#xff1a;借货->高价时卖货>得钱 阶段二&#xff1a;低价时买货 …