Springboot后台接收前端Date类型

From: https://my.oschina.net/zicheng/blog/2963117

这个问题不是专门针对Springboot的,Springmvc也同样适用于这一个问题。

    昨的是Springboot前后端分离的项目,今天和前端对接口发现前端的请求走不到后台,检查了请求什么的都没有问题,最后发现问题在于后台处理前端传过来的时间(Date)问题。

    一般前端提交表单的时候Controller控制器会把表单元素注入到一个command类中,然后发送到后台,但是前端所能传递到后台的数据类型一般是int、char、String等这些基本数据类型,如果我们需要传递一些复杂的数据类型入Integer或者Date这些的时候我们就需要自己去处理了。

    这里我们主要讲解如何处理前端传递过来的Date类型数据。我们这边以接受模型为例,下面代码后台需要接受前端传递过来的时间类型参数startTime(开始时间)和endTime(结束时间),前端数据类型为(2018-11-29 14:48:06)格式数据。

@RequestMapping(value = "/ask",method = RequestMethod.POST)public Result ask(Test test) {
public class Test {// 开始时间private Date startTime;// 结束时间private Date endTime;public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}
}

    这里有三种方式解决这个问题,三种方式解决问题的原理基本相同,我们可以根据具体需求进行选择。

方法一:

    使用@DatetimeFormat注解加载需要接受Date数据的字段上,在接受前端时间的时候会将时间转换为我们需要的格式。

public class Test {// 开始时间@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date startTime;// 结束时间@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date endTime;public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}
}

方法二:

    在对应需要接受Date参数的后台控制器层添加如下代码。

    由@InitBinder表示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是Spring自带的一个类,通过这个类我们可以将前端传递过来的类进行格式转换。当后台接受到前端传递过来的数据类型的时候会在我们的Test这个类里面进行数据的getter个setter,当set的类型不是基本数据类型的时候,由于在目前控制器层这个类中有者下面一段代码,于是日期类型的数据会进到下面代码中进行一次数据转换,我们这里是将前端的数据类型转化为了Date类型然后调用Test类中的set方法设置字段。

    dateFormat.setLenient(false);这里的作用是设置是否严格解析时间,这里默认是true,我们设为false就是要严格解析时间,因为当传递过来的时间格式不规范的时候SimpleDateFormat拥有自动计算功能,这时候会自动解析传递过来的时间然后显示规范的格式。

@InitBinder
public void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(false);//是否严格解析时间 false则严格解析 true宽松解析binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}

    我们这里不仅仅可以来处理时间类型,还可以来处理其它的数据类型(非基本类型数据)如CustomDateEditor、CustomBooleanEditor、CustomNumberEditor等。

@InitBinder
public void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Double.class, new DoubleEditor()); binder.registerCustomEditor(Integer.class, new IntegerEditor());
}

方法三:

    第三种方式是在第二种方式的基础上实现的。同样适用第二种方法中的代码,但是不同在与我们不用在每一个控制器类中都实现一个方法二中的代码,只需要写一个拦截器出来拦截所有的@RequestMapping注解就好。

    如下代码我们新建一个类:

@ControllerAdvice
public class TimeHandler {@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(false);//是否严格解析时间 false则严格解析 true宽松解析binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}
}

    @ControllerAdvice注解被@Component注解,也相当于Spring中的一个组件。@ControllerAdvice有控制器增强的作用,它主要用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,我们这里只给出了@InitBinder的使用方式。

 

    方法二和方法三各有各的优势:方法二需要在每一个用到Date类型接收的控制器层创建一个上面的方法,比较麻烦。方法三比较简单只需要写一个类即可,但是它会拦截每一个前端过来的请求,这样在这方面就不如方法二了。具体如果代码里面只有少数几个地方用到数据类型转换可以使用方法二,如果很多地方需要使用则选用方法三。

 

注意:

    在最开始写这个时间数据类型的时候遇到了一个问题造成了一直接受不到请求如下:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    区别只在与小时的字母大小写问题,上面是接受24小时制时间,下面是接受12小时制时间。同样方法一中也要注意这个问题。

yyyy 代表年 MM 代表月(注意这里要用大写) dd 代表日 HH/hh 代表时(24小时形式/12小时形式) mm 代表分(这里用小写表示分钟)

其中代表月的MM大写是因为为了和时间的分minute区分开,代表日的字母大小写是为了区分24小时形式和12小时形式。

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

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

相关文章

关于jTopo的引用

jTopo是一款 2 D和3D模型展示的插件,不过目前文档不是很齐全,刚开始看的时候就有点懵了,因为你在网上很难找到jTopo的资料。下面我就介绍一下jTopo 的引用吧。 1、首先在官网上下载到jTopo的包,地址:http://www.jtopo.…

mysql重置root密码方法

2019独角兽企业重金招聘Python工程师标准>>> 1. 先关闭mysqld 2. 运行: mysqld_safe --skip-grant-tables 3. 另开一个窗口,用 mysql -uroot 登录mysql,执行 UPDATE mysql.user SET PasswordPASSWORD(你的密码) WHERE User…

插入排序之C++实现

描述 插入排序是一种简单直观的排序算法。它的基本思想是将一个待排序的数据序列分为已排序和未排序两部分,每次从未排序序列中取出一个元素,然后将它插入到已排序序列的适当位置,直到所有元素都插入完毕,即完成排序。 实现思路…

spring boot使用logback实现多环境日志配置

From: https://blog.csdn.net/vitech/article/details/53812137 软件生存周期中,涉及代码运行的环节有编码、测试和维护阶段,而一套成熟的代码,在此三个阶段,数据库、日志路径、日志级别、线程池大小等配置一般会不一样。作为开发…

IOT(Index Organized Table)

我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式。Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表。IOT表上必须要有主键,而IOT表本身不对应segment,表里所有的数据都存放在主键所在的索引的…

C++中的 :: 用法

::是运算符中等级最高的,它分为三种:1)global scope(全局作用域符),用法(::name)2)class scope(类作用域符),用法(class::name)3)namespace scope(命名空间作用域符),用法(namespace…

Spring Boot SLF4J日志实例

From: https://blog.csdn.net/lxh18682851338/article/details/78560295 默认情况下,SLF4j日志记录包含在Spring Boot Web应用程序中,只需要启用它就可以了。 注意:查看此Spring Boot Logback XML模板以了解默认的日志记录模式和配置。 SLF4…

java 反取字符串

public class demo2 {/*** 2 : 将字符串反取出来 新中国好 好国中新*/public static void main(String[] args) {String s "新中国好";s reverse1(s);System.out.println("方法一:" s);s reverse2(s);System.out.println("方法二…

测试使用wiz来发布blog

晚上尝试了下用wiz写随笔并发布,貌似成功了,虽然操作体验和方便性上不如word,但起码它集成了这个简单的功能可以让我用:如果能让我自动新建blog文章并自动定时更新发布就完美了。2013年7月5日19:31:04发现最近开始慢慢重度使用wiz…

Spring在Java Filter注入Bean为Null的问题解决

From: https://www.cnblogs.com/EasonJim/p/7666009.html 在Spring的自动注入中普通的POJO类都可以使用Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性。(因为这两个归Web容器管理)可以用init&#xf…

关于工作的选择之软件开发还是软件维护的建议

今天是周六休息,好可爱的双休日啊。下周一出差去四平,要和我们单位另外2名工程师一起去给四平的一个公司安装调试一个机房的设备,大概需要三天的时间吧。昨天晚上去个朋友家做客,朋友他侄子大学是学计算机软件的,今年刚…

Mybatis:resultMap的使用总结

From: https://www.cnblogs.com/kenhome/p/7764398.html Mybatis的介绍以及使用:http://www.mybatis.org/mybatis-3/zh/index.html resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个…

NSOperation, NSOperationQueue 原理探析

通过GNUstep的Foundation来尝试探索下NSOperation,NSOperationQueue 示例程序 写一个简单的程序 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self configurationQueue]; LDNSOperatio…

MyBatis总结六:resultMap详解(包含多表查询)

From: https://www.cnblogs.com/Alex-zqzy/p/9296039.html 简介:   MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性&a…

object c 快速构建对象

__block NSNumber *capacity (0);

mysql语句添加索引

1.PRIMARY KEY(主键索引) mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column ) 2.UNIQUE(唯一索引) mysql>ALTER TABLE table_name ADD UNIQUE (column ) 3.INDEX(普通索引) mysql>ALTER TABLE table…

基于beego一键创建RESTFul应用

2019独角兽企业重金招聘Python工程师标准>>> API应用开发入门 Go是非常适合用来开发API应用的,而且我认为也是Go相对于其他动态语言的最大优势应用。beego在开发API应用方面提供了非常强大和快速的工具,方便用户快速的建立API应用原型&#…

MyBatis中in的使用

From: https://www.cnblogs.com/w-bb/articles/6378031.html foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有 item,index,collection,open,separator,close…

JS 限制input框的输入字数,并提示可输入字数

<!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>限制文件字数字</title> </head> <body> <span class"span">备注信息</br><span id"stay" sty…

采购订单单价金额屏蔽

应用 Oracle Purchasing 层 Level Function 函数名 Funcgtion Name CUXPOXPOVPO 表单名 Form Name POXPOVPO 说明 Description 采购订单单价金额屏蔽 条件 Condition 触发器事件 Tirgger Event WHEN-NEW-FORM-INSTANCE 触发器对象 Tirgger Object / 条件 Cond…