文档章节

Spring MVC JSON自定义类型转换

Yemon
 Yemon
发布于 2016/05/17 10:32
字数 637
阅读 3
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

类型有很多,这里只用日期为例说明。


在Spring MVC中存在两大类的类型转换,一类是Json,一个是Spring的Binder转换。


JSON:

使用Json转换时,可以如下使用:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Test {  
  2.       
  3.     private Date createdate;  
  4.   
  5.     @JsonSerialize(using = DateYMDHMSJsonSerializer.class)  
  6.     public Date getCreatedate() {  
  7.         return createdate;  
  8.     }  
  9.   
  10.     @JsonDeserialize(using = DateYMDHMSJsonDeserializer.class)  
  11.     public void setCreatedate(Date createdate) {  
  12.         this.createdate = createdate;  
  13.     }  
  14. }  

可以看到这里使用了两个Json转换的注解:

第一个@JsonSerialize是转换为字符串,主要是后台传递给前台时的日期格式;

第二个@JsonDeserialize是转换字符串为日期类型,主要是从前台往后台传递时的日期。


两个具体转换类的实现:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Description: 日期转换 - "yyyy-MM-dd HH:mm:ss" 
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-04-17 10:59) 
  5.  */  
  6. public class DateYMDHMSJsonSerializer extends JsonSerializer<Date>{  
  7.     @Override  
  8.     public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {  
  9.         try {  
  10.             jsonGenerator.writeString(DateUtil.formatDate(date, DateUtil.DATE_FORMAT_TIME_T));  
  11.         } catch (BusinessException e) {  
  12.             jsonGenerator.writeString(String.valueOf(date.getTime()));  
  13.         }  
  14.     }  
  15. }  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Description: 日期转换 - "yyyy-MM-dd HH:mm:ss" 
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-04-17 10:59) 
  5.  */  
  6. public class DateYMDHMSJsonDeserializer extends JsonDeserializer<Date> {  
  7.     @Override  
  8.     public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {  
  9.         try {  
  10.             return DateUtil.formatStringToDate(jp.getText(), DateUtil.DATE_FORMAT_TIME_T);  
  11.         } catch (BusinessException e) {  
  12.             return new Date(jp.getLongValue());  
  13.         }  
  14.     }  
  15. }  

其中DateUtil是一个对日期格式转换的工具类,使用的SimpleDateFormat进行转换。


Binder:

这种类型转换的时候,使用的是Spring的参数绑定,代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Description: 全局类型转换 
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-05-26 13:08) 
  5.  */  
  6. public class GlobalDataBinder implements WebBindingInitializer {  
  7.     /** 
  8.      * 智能日期转换,针对四种格式日期: 
  9.      * 1.2014-05-26 
  10.      * 2.1401951570548 
  11.      * 3.2014-05-26 00:00 
  12.      * 4.2014-05-26 00:00:00 
  13.      */  
  14.     private class SmartDateEditor extends PropertyEditorSupport {  
  15.         /** 
  16.          * 根据2014-05-26 00:00:00长度来判断选择哪种转换方式 
  17.          */  
  18.         @Override  
  19.         public void setAsText(String text) throws IllegalArgumentException {  
  20.             if (text == null || text.length() == 0) {  
  21.                 setValue(null);  
  22.             } else {  
  23.                 try {  
  24.                     if (text.length() == 10) {  
  25.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_YYYYMMDD));  
  26.                     } else if (text.length() == 13) {  
  27.                         setValue(new Date(Long.parseLong(text)));  
  28.                     } else if (text.length() == 16) {  
  29.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_R));  
  30.                     } else if (text.length() == 19) {  
  31.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_T));  
  32.                     } else {  
  33.                         throw new IllegalArgumentException("转换日期失败: 日期长度不符合要求!");  
  34.                     }  
  35.                 } catch (Exception ex) {  
  36.                     throw new IllegalArgumentException("转换日期失败: " + ex.getMessage(), ex);  
  37.                 }  
  38.             }  
  39.         }  
  40.   
  41.         /** 
  42.          * 转换为日期字符串 
  43.          */  
  44.         @Override  
  45.         public String getAsText() {  
  46.             Date value = (Date) getValue();  
  47.             String dateStr = null;  
  48.             if (value == null) {  
  49.                 return "";  
  50.             } else {  
  51.                 try {  
  52.                     dateStr = DateUtil.formatDate(value, DateUtil.DATE_FORMAT_TIME_T);  
  53.                     if (dateStr.endsWith(" 00:00:00")) {  
  54.                         dateStr = dateStr.substring(010);  
  55.                     } else if (dateStr.endsWith(":00")) {  
  56.                         dateStr = dateStr.substring(016);  
  57.                     }  
  58.                     return dateStr;  
  59.                 } catch (Exception ex) {  
  60.                     throw new IllegalArgumentException("转换日期失败: " + ex.getMessage(), ex);  
  61.                 }  
  62.             }  
  63.         }  
  64.     }  
  65.   
  66.     @Override  
  67.     public void initBinder(WebDataBinder binder, WebRequest request) {  
  68.         //日期格式转换  
  69.         binder.registerCustomEditor(Date.classnew SmartDateEditor());  
  70.     }  
  71.   
  72. }  

这里对日期类型进行了一些判断来特殊处理。该类需要在Spring的xml进行配置:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  2.     <property name="webBindingInitializer">  
  3.       <bean class="com.easternie.sys.common.GlobalDataBinder"/>  
  4.     </property>  
  5. </bean>  
通过这种配置之后,Spring就能对日期进行智能转换了。

本文转载自:http://blog.csdn.net/hj7jay/article/details/50920769

Yemon
粉丝 10
博文 322
码字总数 23853
作品 0
广州
架构师
私信 提问
加载中
请先登录后再评论。
Spring MVC 数据转换和格式化

HttpMessageConverter和JSON消息转换器   HttpMessageConverter是定义从HTTP接受请求信息和应答给用户的   HttpMessageConverter是一个比较广的设计,虽然Spring MVC实现它的类有很多种,...

osc_8i32hj13
2019/07/03
4
0
Spring MVC(3)Spring MVC 高级应用

  一、Spring MVC 的数据转换和格式化   前面的应用,都只是用HandlerAdapter去执行处理器。     处理器和控制器不是一个概念,处理器是在控制器功能的基础上加上了一层包装,有了这...

osc_r8gstrez
2018/10/12
1
0
spring MVC扩展和SSM整合

JSON对象的处理 简述@ResponseBody注解的用法  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回J...

osc_d3xth7wj
2018/08/10
2
0
SpringMVC源码阅读:Json,Xml自动转换

1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring4.3.7)分析,弄清楚Sprin...

osc_x8zrsf7v
2019/02/02
3
0
SpringCloud SpringBoot mybatis分布式微服务云架构返回JSON格式

在上述例子中,通过统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。 本质上,只需在之...

itcloud
2018/08/07
321
0

没有更多内容

加载失败,请刷新页面

加载更多

向您推荐Groove BizTalk Workspace!

什么是Groove Office Groove 2007 是一个协作软件程序,适合用于处理从简单的文档协作到与业务过程集成的自定义解决方案的各种项目活动。 Office Groove 2007 的以下十大方式可帮助您和您的团...

osc_o8ipcpa5
28分钟前
19
0
【我的Android进阶之旅】你可能不知道android.view.View#setAlpha()方法也会影响你的APP性能!

一、问题描述 最近在优化APP的性能的时候,发现了一个平时完全没有注意到的一个能够影响APP性能的代码。这个代码就是调用了android.view.View#setAlpha()方法。 1.1 需求描述 APP有个需求,是...

osc_y08db3kb
29分钟前
21
0
lsof命令详解

lsof命令详解 lsof 简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境中一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制...

osc_htns3spg
30分钟前
14
0
设置非root账号不用sudo直接执行docker命令

环境信息 操作系统:Ubuntu 20.04 LTS 桌面版 Docker:19.03.10 现状 当前账号是willzhao,直接执行docker xxx命令会报以下错误: willzhao@ideapad:~$ docker imagesGot permission denie...

osc_kl6fknqf
31分钟前
10
0
小米净水器更换滤芯步骤和水龙头亮黄灯的解决办法

【开篇序言】 众所周知,无论何种品牌的净水器,滤芯都是有一定使用寿命的,而不是一次性安装可永久使用,如果遇到无需换滤芯这类宣布,请远离,不靠谱。换滤芯,小米净水器也不例外,小米净...

osc_zzg7fpke
32分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部