前端传递不同格式时间后端统一转化

news/2025/1/11 19:48:23/文章来源:https://www.cnblogs.com/zz0203/p/18199735

这几天遇到了一个问题,就是我后端再接受查询条件的时候,关于条件我都是用 TimeQuery 来接受的,但是因为前端的比较混乱,就导致了有些传参是年月日,有些传参是年月日时分秒格式,就导致我后端一直出转化异常的错误,当时就是叫前端传参都用下统一的格式

package com.state.time;
@Data
public class  TimeQuery implements Serializable {//    @DateTimeFormat(pattern = DatePattern.NORM_DATE_PATTERN)private Date beginTime;//    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)private Date endTime;
}

后来空下来了之后就在想有没有什么方法能够解决这块的问题


1:我一开始就是想到了aop ,但是后来在写的过程中就发现不对劲了,我就想到的是平时都用aop来打印controller层的入参,这就说明aop拦截的时候那个前端的传参早就已经转化了,果然在实验的过程中就发现这样不行的

2:面对着这种没有思路的问题,我就试着能不能通过 通义灵码的插件看看有没有方法

首先就是提问:

image-20240518192836579

他给的回答是

1. 请求映射(@RequestMapping)
2. 参数绑定
3. 消息转换器(HttpMessageConverter)

就感觉这个参数绑定是我想要的,因为我想的是在前端传递了yyyy-MM-dd ,要在后端赋值到Date上,总是和参数绑定有关的

于是就

image-20240518193236233

它提到了一点

image-20240518194239445

这个RequestBodyAdviceAdapter听起来就像是@RequestBody使用的,而我想要的是url请求

于是就开始尝试 HttpMessageConverter

image-20240518201251528

在这过程中我发现

通过url 传参
@DateTimeFormat(pattern = "yyyy-MM-dd") 
如果里面的格式是 yyyy-MM-dd 那么他能够兼容 传递的是年月日或者年月日时分秒  但是 他会把时分秒 给忽略掉
如果格式是 yyyy-MM-dd HH:mm:ss 那么只能传递的格式必须是年月日时分秒  否则就会出错

发现无法满足要求了接着提问

image-20240518200230285

再描述下需求

image-20240518200308428

这边已经成功了。按照提示写了代码

package com.state.time;
/*** @author zhang* @date 2024-05-18 18:40**/
import org.springframework.core.convert.converter.Converter;
import java.util.Date;
public class FlexibleDateTimeConverter implements Converter<String, Date> {@Overridepublic Date convert(String source) {return TimeQuery.parseDateTime(source);}
}
package com.state.time;
import com.state.time.convert.FlexibleDateTimeConverter;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/*** @author zhang* @date 2024-05-18 14:04**/
@Component
public class MyWebConfigur implements WebMvcConfigurer  {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {//加入头部,第一个被解析converters.add(0, new MyHttpMessageConverter());}@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(new FlexibleDateTimeConverter());}
}

但是他有瑕疵,就是convert 是属于全局的转化器,就是别的地方一旦遇到了Date 他也会进行转化,这就很难控制,毕竟会对别的地方产生影响

于是再接着问:

image-20240518200429148

在然后就是给了解决的方法 @InitBinder 在想要转化的controller类文件里面加入这个

    @InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new FlexibleDateTimeEditor());}

下面是代码:

package com.state.controller;
import com.state.time.TimeQuery;
import com.state.time.convert.FlexibleDateTimeEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.Date;/*** @author zhang* @date 2024-03-13 10:46**/
@RestController
@RequestMapping("test")
public class TestController {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new FlexibleDateTimeEditor());}@GetMappingpublic Object test(TimeQuery timeQuery){System.out.println(timeQuery);return timeQuery;}
}
package com.state.time.convert;import java.beans.PropertyEditorSupport;
/*** @author zhang* @date 2024-05-18 19:04**/
public class FlexibleDateTimeEditor extends PropertyEditorSupport {private final FlexibleDateTimeConverter converter = new FlexibleDateTimeConverter();@Overridepublic void setAsText(String text) {setValue(converter.convert(text));}
}
package com.state.time.convert;/*** @author zhang* @date 2024-05-18 18:40**/
import com.state.time.TimeQuery;
import lombok.Data;
import org.springframework.core.convert.converter.Converter;
import java.util.Date;@Data
public class FlexibleDateTimeConverter implements Converter<String, Date> {@Overridepublic Date convert(String source) {return TimeQuery.parseDateTime(source);}
}
package com.state.time;import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
/*** 分页查询实体类** @author zhang*/@Data
public class  TimeQuery implements Serializable {@DateTimeFormat(pattern = DatePattern.NORM_DATE_PATTERN)private Date beginTime;//    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
//    @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)private Date endTime;private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList(DateTimeFormatter.ofPattern("yyyy-MM-dd"), // 年月日DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") // 年月日 时分秒);public static Date parseDateTime(String input) {return FORMATTERS.stream().map(formatter -> {try {return DateUtil.parse(input, formatter);} catch (DateTimeParseException e) {return null;}}).filter(Objects::nonNull).findFirst().orElseThrow(() -> new IllegalArgumentException("Invalid date/time format"));}}

顺便问问

image-20240518201538189

@InitBinder 是 Spring MVC 框架中的一个注解,用于在控制器类 (@Controller 或 @RestController) 中声明一个方法,该方法会在每次控制器处理请求之前执行,用于初始化数据绑定过程。这个初始化方法通常用于设置数据绑定的特定行为,比如注册自定义的属性编辑器(PropertyEditor)或格式化器(Formatter),以及设置数据绑定的约束和验证规则。  @InitBinder 注解的方法可以设置一个或多个参数,这些参数通常使用 WebDataBinder 类型,它提供了配置数据绑定行为的API。例如,你可以使用 WebDataBinder 注册自定义的转换器或编辑器,以便在将请求参数绑定到控制器方法的参数时使用这些转换器。

给的例子

import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;@Controller
public class MyController {@InitBinderprotected void initBinder(WebDataBinder binder) {binder.registerCustomEditor(LocalDateTime.class, new FlexibleDateTimeEditor());}// 其他控制器方法...
}

在这个例子中,initBinder 方法会在每个控制器方法执行之前调用,FlexibleDateTimeEditor 负责将请求参数转换为 LocalDateTime 类型。 请注意,@InitBinder 方法只对当前控制器类有效,不会影响其他控制器类。如果你有多个控制器需要同样的初始化行为,你可以创建一个基类控制器,然后在这些控制器中继承并重用 @InitBinder 方法,或者使用 @ControllerAdvice 注解来创建一个全局的初始化逻辑,但后者通常用于更广泛的用途,例如全局异常处理或模型属性的初始化。

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

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

相关文章

XYCTF2024

XYCTF2024 warm up 又是md5 源码 <?php include next.php; highlight_file(__FILE__); $XYCTF = "Warm up"; extract($_GET);if (isset($_GET[val1]) && isset($_GET[val2]) && $_GET[val1] != $_GET[val2] && md5($_GET[val1]) == md5(…

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中,我们在本地部署了**Llama 3 8B**参数大模型,并用 Python 写了一个控制台对话客户端,基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化,体验不是很友好,我们希望能有个类似 ChatGPT 那样的 Web 聊天对话界面,本博文就安排起来……在上一篇博文…

常见Windows图标和缩略图问题的解决方法 steam图标变白、变地球

常见Windows图标和缩略图问题的解决方法 steam图标变白、变地球原文地址:https://itxiaozhang.com/common-windows-icon-thumbnail-issues-solutions/ 此教程配合视频学习效果最佳,视频教程在文章末尾。Windows桌面图标问题指南 在使用Windows操作系统时,我们经常会遇到各种…

使用GET方法访问网站

使用GET方法访问网站 服务器接收get参数 server.pyimport flask app = flask.Flask(__name__) @app.route(/) def index():province = flask.request.args.get(province)city = flask.request.args.get(city)print(province, city)return province+","+citydebug=Tru…

m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长

1.算法仿真效果 matlab2022a仿真结果如下:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check, LDPC)是一种高效的前向纠错码,因其优越的纠错性能和近似香农限的接近程度而广泛应用于现代通信系统中。LDPC码的编译码算法众多,其中Belief Propagation(BP)…

免费解锁Windows 11的HEVC支持:轻松播放4K电影的详细步骤

Windows 11的HEVC支持Windows 11 安装完成后,用电影和电视这个应用打开4K或者8K的MP4文件时,提示缺少解码器 以下就是本人解决过程 第一步:查找HEVC扩展的Microsoft Store页面 (本人直接浏览器打开:https://apps.microsoft.com/,搜索HEVC扩展,得到以下页面)复制地址栏的…

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础 在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。这两个模块包含了许多与文件和目录操作相关的函数。 理解os模块 os模块是Python中…

解决Python执行命令时路径空格引发的困扰

哈喽,大家好,我是木头左!在编程实践中,常常需要通过Python执行系统命令,这包括调用外部程序、脚本或是其他命令行工具。然而,一个看似简单却常被忽视的细节——文件路径中的空格,可能会导致程序意外崩溃或行为异常。本篇文章将深入探讨当路径中包含空格时,如何在Python…

Winform窗体的属性页没有显示筛选框

新建一个Wiform项目,在新窗体中添加了一些Button、TextBox,然后查看这个窗体的属性页,发现属性页上方没有属性筛选框 如果你装了Dev Express,那么在窗体上放置一些Dev的控件,发现属性出现了筛选框 然后尝试一下创建一个Dev窗体DevExpress.XtraEditors.XtraForm,仍然不会出…

视觉Mamba的多向扫描策略真的有效吗?

前言 本文对主流的扫描方向及其组合对遥感图像语义分割的影响进行了全面的实验研究。通过在LoveDA、ISPRS Potsdam和ISPRS Vaihingen数据集上广泛的实验,我们证明了无论其复杂性或扫描方向的数量,没有一个扫描策略能够显著优于其他策略。所以对于高分辨率遥感图像的语义分割,…

【论文笔记-55~】多语言实体对齐

2012~2018 Multilingual Knowledge Graph Embeddings for Cross-lingual Knowledge Alignment 文章核心观点: 这篇文章介绍了一种名为MTransE的多语言知识图谱嵌入模型,旨在实现跨语言知识对齐。该模型由知识模型和匹配模型两部分组成,其中知识模型采用TransE对每个语言的实…

博客美化

目录参考链接页面定制css代码页首HTML代码页脚HTML代码其他设置头部背景图设置 参考链接awescnb自己部署皮肤文件页面定制css代码 #loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:#f4f5f5;pointer-events:none;}.loader-inner{will-cha…