springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate

日期类型的参数在从前端通过url参数传递到后端时,它会被进行格式化,如果格式化失败会出现400的错误,像日期格式默认会使用yyyy/MM/dd的格式,如果希望自己去个性化配置,我们可以通过实现WebMvcConfigurer接口的addFormatters方法来完成。

java.time.LocalDate统一处理

  • DateTimeFormatterRegistrar实例的setTimeFormattersetDateFormattersetDateTimeFormatter可以很方便的指定LocalDate这些类型的格式
  • 通过定义DateFormatter对象,可以声明java.util.Date类型的格式,但默认的,你只能定义一个java.util.Date对应的格式,多个的话,被会覆盖
  • 通过实现org.springframework.format.Formatter<Date>接口,来定义多个java.util.Date对应的格式,它可以进行遍历,并进行最优的格式匹配

代码的实现

/**
 * WebMvc配置.
 * @author lind
 * @date 2023/5/24 23:46
 * @since 1.0.0
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

	/**
	 * 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter.
	 * <ul>
	 * <li>HH:mm:ss -> LocalTime</li>
	 * <li>yyyy-MM-dd -> LocalDate</li>
	 * <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
	 * </ul>
	 * @param registry
	 */
	@Override
	public void addFormatters(FormatterRegistry registry) {
		DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
		// LocalDate,LocalTime,LocalDateTime格式化
		registrar.setTimeFormatter(DatePattern.NORM_TIME_FORMATTER);
		registrar.setDateFormatter(DatePattern.NORM_DATE_FORMATTER);
		registrar.setDateTimeFormatter(DatePattern.NORM_DATETIME_FORMATTER);
		registrar.registerFormatters(registry);
		// java.util.Date日期格式化
		registry.addFormatter(new CompositeFormatter());
	}

	/**
	 * java.util.Date日期格式化.
	 */
	private static class CompositeFormatter implements Formatter<Date> {

		private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),
				new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));

		@Override
		public Date parse(String text, Locale locale) throws ParseException {
			for (Formatter<Date> formatter : formatters) {
				try {
					return formatter.parse(text, locale);
				}
				catch (ParseException ignored) {
				}
			}
			throw new ParseException("Unable to parse date: " + text, 0);
		}

		@Override
		public String print(Date date, Locale locale) {
			return formatters.get(0).print(date, locale);
		}

	}

}

测试代码与截图

  • 代码
    @GetMapping("print")
	public ResponseEntity print(@RequestParam LocalDateTime date, @RequestParam Date simple) {
		Map<String, Object> result = new HashMap<>();
		result.put("time", date);
		result.put("simple", simple);
		return ResponseEntity.ok(result);
	}
  • 调用和结果

作者:仓储大叔,张占岭,
荣誉:微软MVP
QQ:853066980

支付宝扫一扫,为大叔打赏!

本文转载于网络 如有侵权请联系删除

相关文章

  • 在Debian 7 下安装Docker 虚拟一个CentOS

    目前docker官方支持的Debian系操作系统,只有Ubuntu12.04+和Debian8.0Jessie(64-bit),不支持Debian7Wheezy。由于之前Docker运行时,要求Linuxkernel必须在3.8以上,Go要1.2+,Debian7需要升级内核和编译新版Go才能安装,如果是用OpenVZVPS的话,是无法升级内核的。不过从Docker0.8开始,已经不再依赖这些了。只要Linuxkernelversion在2.6.32-431以上即可。PS:Docker1.0正式发布!1.0版本包含很多新特性,这也是Docker的首个产品级的版本。从今天开始,你将会一直听到一个新的概念——Dockerasaplatform,其组件包括Docker引擎、容器运行时和打包工具以及DockerHub,这是一个基于云端的协作、内容和工作流自动化的服务。确认内核版本uname-r使用官方的ubuntu的软件源,它和debian7是兼容的:echodebhttp://get.docker.io/ubuntudockermain|sudotee/etc/apt/sources.lis

  • 等渗回归和PAVA算法

    磐创AI分享来源|analyticsvidhya作者|NOOBMASTER21编译|Flin介绍等渗回归是很少被谈论但肯定是最酷的回归技术之一。我之所以说“很少谈论”,是因为与线性回归不同,它不经常被讲授或使用。等渗回归做出一个更笼统的假设,即最能代表数据的函数是单调的,而不是线性的(是的,线性也是单调的,反之亦然)。“Isotonic(等渗)”一词源自两个希腊词根:“iso”和“tonos”;“iso”的字面意思是相等,“tonos”的意思是伸展。因此,等渗回归(也称为等长回归),对数据拟合一个分段常数非递减(阶梯状)函数,因此提供了线性回归的替代方法,线性回归本质上对数据拟合一条直线。与线性回归相比,这是等渗回归的样子。如果你像我一样,那么你可能想知道算法背后的数学知识,然后才能开始使用它们。对于任何希望使用该算法获得最佳结果的人来说,确切地知道是什么原因导致了算法的行为方式是一个好习惯。所以这是我们要做的:首先,我们将阐述等渗回归所解决的问题。然后,我们将看一些数学并尝试了解解决方案。在这一部分中,我们将学习PAVA算法。最后,我们将研究它在python中的实现及其主要应用程序

  • kubernetes指南--弹性伸缩

    0x0pre弹性伸缩这种功能,不是很多系统都已经实现了,我们直接用就行了吗,为什么还需要个指南呢。 因为。。。。我们先来看看都有哪些相关知识点吧。。。弹性伸缩涉及到各种软硬件,各色调度平台,策略和系统,其本身就是一个较复杂的课题。此外,kubernetes不单单是一个容器调度平台,而是一个活跃,庞大的生态系统。 kubernetes弹性伸缩这个课题涉及了诸多知识点,主要如下:-水平(Horizontal)伸缩 -垂直(Vertical)伸缩 -定时(Scheduled)伸缩 -预测(Predictive)性伸缩 -服务画像 -node -service -CA -cloudprovider -VPA -HPA -HPAcontroller -metric -metricserver -heapster -metricstate -prometheus -CRD -custommetricapi -prometheusadapter -cronhpacontroller -cloudcontrollermanager复制在刚开始调研这个课题的时候,一上来看到这么多名词和术语,肯定会一脸懵

  • springMVC系列(六)——拦截器实现自定义注解接口访问限制

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/luo4105/article/details/72327249通过自定义注解形式实现接口访问评论限制1.自定义注解,访问限制值和时间放在注解的参数中RequestLimit.java注解@Retention(RetentionPolicy.RUNTIME) public@interfaceRequestLimit{ /** * *允许访问的次数,默认值MAX_VALUE */ intcount()defaultInteger.MAX_VALUE; /** * *时间段,单位为毫秒,默认值十分钟 */ longtime()default600000; }复制 2.拦截器主要代码1.当拦截器获得客户端请求,redis生成根据组合code判断是否存在,如果存在,取得计数器a.如果计数器大于最大访问数量,returnfalse;限制其访问b.如果小于,计数器加1如果不存在,创建一个带定时的、key为组合code的计数器,数字为1/** *接

  • 美团起源数据治理平台的建设与实践

    背景作为一家高度数字化和技术驱动的公司,美团非常重视数据价值的挖掘。在公司日常运行中,通过各种数据分析挖掘手段,为公司发展决策和业务开展提供数据支持。经过多年的发展,美团酒旅内部形成了一套完整的解决方案,核心由数据仓库+各种数据平台的方式实现。其中数据仓库整合各业务线的数据,消灭数据孤岛;各种数据平台拥有不同的特色和定位,例如:自助报表平台、专业数据分析平台、CRM数据平台、各业务方向绩效考核平台等,满足各类数据分析挖掘需求。早期数据仓库与各种数据平台的体系架构如图1所示:图1酒旅早期各数据平台和数据仓库体系架构图图1所示的体系架构,在业务需求的满足上非常高效,但在长时间的使用过程中,也产生了如下一些问题:·各数据平台或平台内不同模块的指标定义不一致。·各数据平台或平台内不同模块指标计算口径不一致。·各数据平台或平台内不同模块指标数据来源不一致。上述这些问题总结归纳起来,就是指标数据不一致的问题,最终带来的后果是指标数据可信度底,严重影响分析决策。通过后续追踪分析,上述问题的由来,主要是不同业务线的数据分析人员、数据开发人员,以及不同的产品之间,缺乏有效的沟通,也没有一个统一的入口,来

  • 牛逼哄哄的 "零拷贝" 是什么?

    作者:ksfzhaohuijuejin.im/post/5cad6f1ef265da039f0ef5df前言从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能;这个词我们也经常在javanio,netty,kafka,RocketMQ等框架中听到,经常作为其提升性能的一大亮点;下面从I/O的几个概念开始,进而在分析零拷贝。I/O概念1、缓冲区缓冲区是所有I/O的基础,I/O讲的无非就是把数据移进或移出缓冲区;进程执行I/O操作,就是向操作系统发出请求,让它要么把缓冲区的数据排干(写),要么填充缓冲区(读);下面看一个java进程发起read请求加载数据大致的流程图:进程发起read请求之后,内核接收到read请求之后,会先检查内核空间中是否已经存在进程所需要的数据,如果已经存在,则直接把数据copy给进程的缓冲区;如果没有内核随即向磁盘控制器发出命令,要求从磁盘读取数据,磁盘控制器把数据直接写入内核read缓冲区,这一步通过DMA完成;接下来就是内核将数据copy到进程的缓冲区;如果进程发起write请求,同样需要把用户缓冲区里面的数据copy到内核的socket缓冲区里面,

  • Python 中排序方法的十条用法总结

    sorted用于对集合进行排序(这里说的集合是对可迭代对象的一个统称,他们可以是列表、字典、set、甚至是字符串),它的功能非常强大,本文将深入浅出地介绍sorted的各种使用场景。 1、默认情况,sorted函数将按列表升序进行排序,并返回一个新列表对象,原列表保持不变,最简单的排序>>>nums=[3,4,5,2,1] >>>sorted(nums) [1,2,3,4,5]复制2、降序排序,如果要按照降序排列,只需指定参数reverse=True即可>>>sorted(nums,reverse=True) [5,4,3,2,1]复制3、如果要按照某个规则排序,则需指定参数key,key是一个函数对象,例如字符串构成的列表,我想按照字符串的长度来排序>>>chars=['Andrew','This','a','from','is','string','test'] >

  • 对抗网络用于人脸转正--Beyond Face Rotation

    BeyondFaceRotation:GlobalandLocalPerceptionGANforPhotorealisticandIdentityPreservingFrontalViewSynthesishttps://www.arxiv.org/abs/1704.04086本文主要解决的问题是把一张侧脸照片变成正脸照片,可以用这种照片进行人脸特征分析如人脸识别。 生成的图像效果相当不错。效果如下图所示: 其实已经有相关文献使用深度学习将侧脸照片变成正脸照片,但是效果不是很好。我们这里使用了对抗网络提升了性能。对抗网络:GenerativeAdversarialNetwork(GAN) GAN在深度学习和计算机视觉中的影响很大,它主要可以估计目标分布,产生新的图像样本。estimatetargetdistributionandgeneratenovelimagesamplesNetworkArchitecture 这里采用双通道网络,TwoPathwayGenerator,一个是localpathway,另一个是globalpathway. localpathway用于解决人脸的细

  • Kronos银行木马被发现,疑似新版Osiris木马

    根据Proofpoint安全研究人员的说法,新版本的Kronos银行木马正蠢蠢欲动,研究人员证实,最近三次宣传这个旧木马的翻新版本在2014年经历了鼎盛时期。根据昨天晚上发布报告显示,今年4月,研究人员已经发现了这种新型Kronos变种的第一批样本。最初的样本似乎是处于测试阶段,实际活动在6月下旬开始实施,当时研究人员开始检测malspam并利用套件向野外用户提供这个新版本。活动针对德国,日本,波兰Proofpoint报告发现了三个活动和一个测试运行,活动主要针对德国,日本和波兰银行的用户。在此活动中使用该恶意软件不是原来的Kronos,而是在2014版本基础上更新了几个版本。Proofpoint报告了2018年和2014年版本之间广泛的代码重叠。相似之处包括2018版本使用相同的WindowsAPI散列技术和散列,相同的字符串加密技术,相同的C&C加密机制,相同的C&C协议和加密,相同的webinject格式(Zeus格式)以及类似的C&C面板文件布局。但这两个版本并不完全相同。主要区别在于2018版使用Tor托管的C&C控制面板。Kronos2018版可能是新版Osiris木马研究

  • 数据科学家/数据工程师

    Asthefieldofdatasciencecontinuestogrowandmature,itisnicetobeginseeingsomedistinctionintherolesofadatascientist.Anewjobtitlegainingpopularityisthedataengineer.Inthispost,Ilayoutsomeofthedistinctionsbetweenthe2roles. DataScientistAdatascientistisresponsibleforpullinginsightsfromdata.Itisthedatascientistsjobtopulldata,createmodels,createdataproducts,andtellastory.Adatascientistshouldtypicallyhaveinteractionswithcustomersand/orexecutives.Adatascientistshouldlovescrubbingadatasetformoreandmoreunderst

  • 如何利用LTE网络协议漏洞把手机踢下网

    诺基亚贝尔实验室和芬兰阿尔托大学的研究人员演示了如何攻击LTE网络协议。之前我们已经多次报道过SS7信号协议的漏洞了,利用协议的漏洞,攻击者可以追踪用户。当用户在各个国家旅游时,他们的手机会连接到当地运营商,然后再与用户本国的运营商联系。SS7协议能够用来漫游,但是这个协议存在漏洞,黑客可以利用漏洞来:跟踪位置 监听 诈骗 对用户或网络发动DoS攻击 窃取密码 数据劫持 短信拦截 通过窃取一次性密码劫持Telegram、facebook、whatsapp的账号Diameter同样能被攻击 Diameter被认为是LTE网络SS7协议的完善版本,理应更加安全,但专家们在这款协议中同样发现了安全问题,其中一个就是没有使用IPsec协议。研究人员表示,这就意味着Diameter能够被用同样的手段攻击。专家团队进行了数次测试评估攻击,测试中,他们对在芬兰的英国用户进行了网络攻击,发现了多种干扰服务的方法。攻击者可以选择暂时或永久地关闭用户连接,也可以针对某一整个地区实施攻击。研究团队在伦敦举行的黑帽大会上演示了成果。攻击过程 要对其他运营商的系统或者用户进行攻击,研究人员首先得要能够访问IPX

  • Mix 08到来之前的Monolight Update

    在Mix08到来之前Mono团队老大MigueldeIcaza's在blog上发布了Pre-Mix08:MoonlightUpdates。根据这篇blog的描述,Monolight基本完成了Silverlight1.0功能的开发:1、Moonlight媒体支持:之前的媒体方面的支持使用的ffmpeg'的管道,ffmpeg'spipeline不能满足实际的需要,现在重写了这部分代码,支持MicrosoftMedia解码,不再依赖于ffmpegs管道,只是使用了ffmpegs的音频、视频解码。最终目标是完全支持MicrosoftMedia。看下面两张图:目前的媒体支持方式最终的媒体支持方式2、视频流:Monolight现在支持视频流播放了,之前的版本只能等视频文件下载到本地临时目录后才能支持回放,现在只要有足够的缓存数据就可以回放了,不过目前还支持http方式,正在实现对MMS-over-HTTP的支持,下周WindowsMediaservers的specsforHTTP-basedstreaming就要发布了,这有助于更好的实现这个功能。3、测试工具Mono

  • 国内常用WordPress经典主题盘点,99%的人不知道,每个都是经典

    wordpress建站门槛可以说非常的低了,一个新手稍微学习一下就可以搞出来一个看起来不错的网站的,一个服务器,域名,wordpress主题只需要这几个要素就可以建出一个不错的成品网站来,但很多人比较纠结如何选择合适的主题,wordpress拥有海量的各种样式和功能的主题。1、DUX大前端的主题这个主题也是经典中的经典,看过太多的网站在使用它了,功能强大并且SEO优化容易。因为这个主题的使用起来,感觉页面还是比较符合我们国人的习惯和审美,因此使用也比较广泛的,当然这个也是付费主题,不过个人建议不差钱的还是去支持原版的吧。主题地址:https://themebetter.com/theme?um=m0o052、YIA主题主题这个主题非常的简约干净,看起来非常的清爽,关键功能也强大,集成深度SEO优化的设置和功能。用作个人或者是企业的内容站点非常合适。支持多语言、一键换色、全站SEO设置、文章图片弹窗、百度收录,适用于各种个人展示网站、博客站、行业站等等,扁平化设计、多设备支持、侧栏随动、列表无限加载、灵活多变的小工具模块。主题地址:https://themebetter.com/them

  • spring-data-redis注册fastjson序列化工具

      使用spring-data-redis的时候,其序列化工具自带:  这些类,进行序列化,主要使用的是Jackson2JsonRedisSerializer,编码如下:      @Bean   @SuppressWarnings({"rawtypes","unchecked"}) publicJackson2JsonRedisSerializerjackson2JsonRedisSerializer(){ Jackson2JsonRedisSerializer<Object>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class); ObjectMapperom=newObjectMapper(); om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacks

  • 小程序数组操作之删除

    数据的删除 在小程序开发的过程中,发现无法直接调用数组的删除方法,所以就自己写了一个,作用是删除数组中某个指定的值。 1//删除方法 2remove:function(array,val){ 3for(vari=0;i<array.length;i++){ 4if(array[i]==val){ 5array.splice(i,1); 6} 7} 8return-1; 9}; 10 11//调用方法 12vararray=['a','b','c']; 13varval='b'; 14this.remove(array,val);复制  

  • JavaWeb项目 中集成 Spring 框架

    原文转载 https://www.cnblogs.com/m-xy/p/3642328.html 你好,茶杯

  • 偏最小二乘回归(PLSR)- 1 概览

    1.概览偏最小二乘算法,因其仅仅利用数据X和Y中部分信息(partialinformation)来建模,所以得此名字。其总体处理框架体现在下面两图中。建议先看第2部分,对pls算法有初步了解后再看此框架,会有更全面深入的体会。得到                                                    

  • 2019年目标

    1.体重降回70kg。 2.马拉松进400。今年要换个地方跑。 3.第二收入(非股市)要超过500。没错,就是500。     有种预感,2019会发财。   完成度: 1. 体重降回70kg了。 2. 马拉松还是在5小时左右。训练不够。 3. 没有。股市回本了。

  • 轮播插件--可支持视频拖拽和可视区播放

    应上头要求写效果插件,实现效果自动轮播、拖动轮播、和支持视频,插件参数提取出来传 slide.js (function($){ $.fn.slide=function(options){ varSlide={}; vardefaults={ animTime:500, height:'80%', width:'70%', autoSlideDelay:6000, pageView:1, btPic:[] }; varopts=jQuery.extend(defaults,options); var$slider=$(".slider"), myVideo=$("livideo"), diff=0, animating=false, curSlide=0, numOfSlides=$(".slide").length-1,//同方向可滑动的最多次数 autoSlideTimeout, $pagination=$(".slideSortBt"); myVideo.attr("flag",false); //console.log($(".slider-container").eq(0).

  • flowable之监听器分配

    packageorg.flowable; importorg.flowable.engine.delegate.TaskListener; importorg.flowable.task.service.delegate.DelegateTask; /** *自定义监听器 */ publicclassMyTaskListenerimplementsTaskListener{ /** *监听器解发方法 *@param */ @Override publicvoidnotify(DelegateTaskdelegateTask){ System.out.println("监听器解发方法:解发了::===>delegateTask.getName()="+delegateTask.getName()); if("创建请假流程".equals(delegateTask.getName())&&"create".equals(delegateTask.getEventName())){ delegateTask.setAssignee("小明"); } } } 复制

  • Typora自动编号设置

    找到C:\Users\用户名\AppData\Roaming\Typora\themes\路径下的base.user.css,用文本编辑器打开(若不存在,则自己创建一个),将一下内容复制进去,然后重启Typora即可。以下是我的Typora自动编号配置:/*正文标题区:#write*/ /*[TOC]目录树区:.md-toc-content*/ /*侧边栏的目录大纲区:.sidebar-content*/ /**initializecsscounter*/ #write,.sidebar-content,.md-toc-content{ counter-reset:h2 } #writeh1,.outline-h1,.md-toc-item.md-toc-h1{ counter-reset:h2 } #writeh2,.outline-h2,.md-toc-item.md-toc-h2{ counter-reset:h3 } #writeh3,.outline-h3,.md-toc-item.md-toc-h3{ counter-reset:h4 } #writeh4,.ou

相关推荐

推荐阅读