SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

场景一:表单中的日期字符串和JavaBean的Date类型的转换

在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换, 例如,如下代码S_ROLE_QO这个bean中包含有Date类型属性,不处理就拿不到值。

/**

* 分页取角色列表

* @param s_ROLE_QO 角色查询条件

* @return

*/

@RequestMapping(value = "/loadRoles", method = RequestMethod.GET)

@ResponseBody

public ServerResponse<List<S_ROLE_EO>> loadRoles( S_ROLE_QO s_ROLE_QO) {

PageHelper.startPage(s_ROLE_QO.getPageIndex(), s_ROLE_QO.getPageSize());

List<S_ROLE_EO> lst = s_ROLE_DAO.getRolesByConditionWithPaging(s_ROLE_QO);

PageInfo<S_ROLE_EO> page = new PageInfo<S_ROLE_EO>(lst);

return new ServerResponse<List<S_ROLE_EO>>(1, null, lst, page.getTotal());

}

而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。

WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。

代码如下:

public static String GREGORIAN_DATEFORMAT= "EEE MMM dd yyyy hh:mm:ss z";

//将表单中特定日期类型的日期字符串转换成Javabean中的日期类型的属性

@InitBinder

protected void initBinder(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat(GREGORIAN_DATEFORMAT, Locale.ENGLISH);

binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

}

场景二:Json中的日期字符串和JavaBean的Date类型的转换

还是上面的代码,只不过加了个@RequestBody,采用json格式传参

这个时候处理方式:

往工程中引入以下包,如果是maven工程,在pom文件中加入

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.7.3</version>

</dependency>

然后在工具包添加如下工具类:

@Component

public class JsonDateSerializer extends JsonSerializer<Date> {

@Override

public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

jsonGenerator.writeString(DateUtil.format(date));

}

}

public class JsonDateDeSerializer extends JsonDeserializer<Date> {

@Override

public Date deserialize(JsonParser p, DeserializationContext ctxt)

throws IOException, JsonProcessingException {

String dataFormat=null;

String date = p.getText();

// 判断客户端传过来的是否是UTC类型

if (p.getText().contains("Z")) {

dataFormat="yyyy-MM-dd'T'HH:mm:ss.SSS Z";

date=date.replace("Z", " UTC");

}

return    DateUtil.format(date,dataFormat) ;

}

}

/**

* 日期工具类

*

* Date类型转换为日期字符串之间的转换

*

*/

public class DateUtil {

/**

* 将Date类型转换为字符串

*

* @param date

* 日期类型

* @return日期字符串

*/

public static String format(Date date) {

return format(date, "yyyy-MM-dd HH:mm:ss");

}

/**

* 将Date类型转换为字符串

*

* @param date

* 日期类型

* @param pattern

* 字符串格式

* @return日期字符串

*/

public static String format(Date date, String pattern) {

if (date == null) {

return "null";

}

if (pattern == null || pattern.equals("") || pattern.equals("null")) {

pattern = "yyyy-MM-dd HH:mm:ss";

}

return new java.text.SimpleDateFormat(pattern).format(date);

}

/**

* 将字符串转换为Date类型

*

* @param date

* 字符串类型

* @return日期类型

*/

public static Date format(String date) {

return format(date, null);

}

/**

* 将字符串转换为Date类型

*

* @param date

* 字符串类型

* @param pattern

* 格式

* @return日期类型

*/

public static Date format(String date, String pattern) {

if (pattern == null || pattern.equals("") || pattern.equals("null")) {

pattern = "yyyy-MM-dd HH:mm:ss";

}

if (date == null || date.equals("") || date.equals("null")) {

return new Date();

}

Date d = null;

try {

SimpleDateFormat sdf = new SimpleDateFormat(pattern);

if (pattern.equals("yyyy-MM-dd'T'HH:mm:ss.SSS Z")) {

sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

}

d = sdf.parse(date);

} catch (ParseException pe) {

}

return d;

}

}

最后在JavaBean的Date类型属性的get set方法上添加如下注解,注意springMVC的注解驱动<mvc:annotation-driven> 要配置

@JsonSerialize(using = JsonDateSerializer.class)

public Date getCreateTimeStart() {

return createTimeStart;

}

@JsonDeserialize(using = JsonDateDeSerializer.class)

public void setCreateTimeStart(Date createTimeStart) {

this.createTimeStart = createTimeStart;

}

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换的更多相关文章

  1. 日期字符串转为java.sql.Date

    日期字符串转为java.sql.Date类型 问题引出:在将一个日期字符串通过sql语句,插入到数据表的日期字段(字段类型是DATE),时遇到一个问题,如何将一个日期字符串转成java.sql.Dat ...

  2. 表单中的日期 字符串和Javabean中的日期类型的属性自动转换

    搞了一上午的bug最终还是因为自己springMVC的注解不熟悉的原因,特记录. 在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支 ...

  3. 表单序列化json字符串和js时间格式化

    js时间格式化 new Date().format("时间格式") Date.prototype.format = function(fmt) { var o = {        ...

  4. SpringMVC 表单验证

    SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单 ...

  5. ★★★【卡法 常用js库】: js汇合 表单验证 cookie设置 日期格式 电话手机号码 email 整数 小数 金额 检查参数长度

    [卡法 常用js库]: js汇合 表单验证  cookie设置  日期格式  电话手机号码  email  整数  小数  金额   检查参数长度 // +---------------------- ...

  6. js Form表单转json格式,及后台接收(多种方法)

    转载:https://blog.csdn.net/qq_40138785/article/details/81533015 一.serialize()方法格式:var data = $("# ...

  7. (转载)SPRINGMVC表单标签简介

    SpringMVC表单标签简介 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容.下面将对这些标签一一介绍. 在正式介绍Spri ...

  8. SpringMVC表单标签简介

    在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容.下面将对这些标签一一介绍. 在正式介绍SpringMVC的表单标签之前,我们需 ...

  9. 将forme表单转换为Json对象

    //将Form 表单转换为Json字符串 $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); ...

随机推荐

  1. python笔记(2)---不定长参数

    python自定义函数中有两种不定长参数, 第一种是*name:加了星号 * 的参数会以元组(tuple)的形式导入 第二种是**name:加了星号 * *的参数会以字典(dict)的形式导入 *na ...

  2. 图片公式转为word格式

    mathpix提取Latex格式,下载mathpix snipping tool工具,截图即可获取Latex格式公式 Latex格式去下面网站转换为mathml格式 https://johnmacfa ...

  3. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)

    0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...

  4. 「THUPC 2017」机场 / Airport

    https://loj.ac/problem/2403 题解 神仙题. 练习赛的时候想了个假建图. 正解太神仙了. 先把不合法情况判掉. 先对时间离散化,每个时间点开一个点. 然后把他们一次串起来,中 ...

  5. 1206C Almost Equal

    题目大意 给你一个n 让你用1~2*n的数填满一个2*n个点的环 使得任意连续的n个位置的和的最大值减最小值不大于1 分析 我们通过瞎jb找规律发现n为偶数吴姐 而n为奇数我们设前n个位置为0组,后n ...

  6. nginx配置-main

    nginx配置分为几大块: main (全局设置) events(nginx工作模式) http(http设置): upstream(负载均衡服务器设置),server(主机设置):location( ...

  7. flutter 按键监听

    import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => ru ...

  8. elasticsearch 5.1 认证过期 (your license has expired)

    首先说一下License过期后的状况: if 设置了登录认证,license过期后将无法登录(无法填入用户名密码,下方给出报错,license过期): if 没有设置登录认证,打开kibaba界面中M ...

  9. 学习:STL----优先队列

    优先队列是队列的高级版,最大的特点是可以内部实现排序 优先队列的定义 优先队列内部使用堆排序,从而实现队列内一直保持着某种顺序规律(比如递增,递减等) 在使用优先队列时,首先要引入头文件:#inclu ...

  10. docker安装及基本命令

    Ubuntu安装docker sudo apt-get install docker.io Centos安装docker # 更新系统软件包 yum -y upgrade # 官方下载地址 curl ...