Spring MVC JSON自定义类型转换(续)

简介:

通过配置全局的日期转换来避免使用麻烦的注解。


首先用到了一个简单的日期工具类DateUtil.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * DateUtil类 
  3.  * 
  4.  * @author liuzh 
  5.  */  
  6. public class DateUtil {  
  7.   
  8.     public static final String Y_M_D = "yyyy-MM-dd";  
  9.     public static final String Y_M_D_HM = "yyyy-MM-dd HH:mm";  
  10.     public static final String Y_M_D_HMS = "yyyy-MM-dd HH:mm:ss";  
  11.     public static final String YMD = "yyyyMMdd";  
  12.     public static final String YMDHM = "yyyyMMddHHmm";  
  13.     public static final String YMDHMS = "yyyyMMddHHmmss";  
  14.     public static final String ymd = "yyyy/MM/dd";  
  15.     public static final String ymd_HM = "yyyy/MM/dd HH:mm";  
  16.     public static final String ymd_HMS = "yyyy/MM/dd HH:mm:ss";  
  17.   
  18.     /** 
  19.      * 智能转换日期 
  20.      * 
  21.      * @param date 
  22.      * @return 
  23.      */  
  24.     public static String smartFormat(Date date) {  
  25.         String dateStr = null;  
  26.         if (date == null) {  
  27.             dateStr = "";  
  28.         } else {  
  29.             try {  
  30.                 dateStr = formatDate(date, Y_M_D_HMS);  
  31.                 //时分秒  
  32.                 if (dateStr.endsWith(" 00:00:00")) {  
  33.                     dateStr = dateStr.substring(010);  
  34.                 }  
  35.                 //时分  
  36.                 else if (dateStr.endsWith("00:00")) {  
  37.                     dateStr = dateStr.substring(016);  
  38.                 }  
  39.                 //秒  
  40.                 else if (dateStr.endsWith(":00")) {  
  41.                     dateStr = dateStr.substring(016);  
  42.                 }  
  43.             } catch (Exception ex) {  
  44.                 throw new IllegalArgumentException("转换日期失败: " + ex.getMessage(), ex);  
  45.             }  
  46.         }  
  47.         return dateStr;  
  48.     }  
  49.   
  50.     /** 
  51.      * 智能转换日期 
  52.      * 
  53.      * @param text 
  54.      * @return 
  55.      */  
  56.     public static Date smartFormat(String text) {  
  57.         Date date = null;  
  58.         try {  
  59.             if (text == null || text.length() == 0) {  
  60.                 date = null;  
  61.             } else if (text.length() == 10) {  
  62.                 date = formatStringToDate(text, Y_M_D);  
  63.             } else if (text.length() == 13) {  
  64.                 date = new Date(Long.parseLong(text));  
  65.             } else if (text.length() == 16) {  
  66.                 date = formatStringToDate(text, Y_M_D_HM);  
  67.             } else if (text.length() == 19) {  
  68.                 date = formatStringToDate(text, Y_M_D_HMS);  
  69.             } else {  
  70.                 throw new IllegalArgumentException("日期长度不符合要求!");  
  71.             }  
  72.         } catch (Exception e) {  
  73.             throw new IllegalArgumentException("日期转换失败!");  
  74.         }  
  75.         return date;  
  76.     }  
  77.   
  78.     /** 
  79.      * 获取当前日期 
  80.      * @param format 
  81.      * @return 
  82.      * @throws Exception 
  83.      */  
  84.     public static String getNow(String format) throws Exception{  
  85.         return formatDate(new Date(), format);  
  86.     }  
  87.   
  88.     /** 
  89.      * 格式化日期格式 
  90.      * 
  91.      * @param argDate 
  92.      * @param argFormat 
  93.      * @return 格式化后的日期字符串 
  94.      */  
  95.     public static String formatDate(Date argDate, String argFormat) throws Exception {  
  96.         if (argDate == null) {  
  97.             throw new Exception("参数[日期]不能为空!");  
  98.         }  
  99.         if (StringUtils.isEmpty(argFormat)) {  
  100.             argFormat = Y_M_D;  
  101.         }  
  102.         SimpleDateFormat sdfFrom = new SimpleDateFormat(argFormat);  
  103.         return sdfFrom.format(argDate).toString();  
  104.     }  
  105.   
  106.     /** 
  107.      * 把字符串格式化成日期 
  108.      * 
  109.      * @param argDateStr 
  110.      * @param argFormat 
  111.      * @return 
  112.      */  
  113.     public static Date formatStringToDate(String argDateStr, String argFormat) throws Exception {  
  114.         if (argDateStr == null || argDateStr.trim().length() < 1) {  
  115.             throw new Exception("参数[日期]不能为空!");  
  116.         }  
  117.         String strFormat = argFormat;  
  118.         if (StringUtils.isEmpty(strFormat)) {  
  119.             strFormat = Y_M_D;  
  120.             if (argDateStr.length() > 16) {  
  121.                 strFormat = Y_M_D_HMS;  
  122.             } else if (argDateStr.length() > 10) {  
  123.                 strFormat = Y_M_D_HM;  
  124.             }  
  125.         }  
  126.         SimpleDateFormat sdfFormat = new SimpleDateFormat(strFormat);  
  127.         //严格模式  
  128.         sdfFormat.setLenient(false);  
  129.         try {  
  130.             return sdfFormat.parse(argDateStr);  
  131.         } catch (ParseException e) {  
  132.             throw new Exception(e);  
  133.         }  
  134.     }  
  135. }  

需要用到的是两个智能转换日期的方法。关于转换的格式和规则,请看这两个方法,如果不符合你需要的,可以自行修改。


然后继承SimpleDateFormat写一个智能转换日期的类SmartDateFormat

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Description: 智能日期转换 
  3.  * Author: liuzh 
  4.  */  
  5. public class SmartDateFormat extends SimpleDateFormat {  
  6.     @Override  
  7.     public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {  
  8.         return new StringBuffer(DateUtil.smartFormat(date));  
  9.     }  
  10.   
  11.     @Override  
  12.     public Date parse(String text) throws ParseException {  
  13.         return DateUtil.smartFormat(text);  
  14.     }  
  15. }  
这里重写了两个方法,这两个方法是互相转换的方法,直接调用的DateUtil提供的两个智能转换的方法。


最后在Spring MVC的xml中配置:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
  2.   <property name="objectMapper">  
  3.     <bean class="org.codehaus.jackson.map.ObjectMapper">  
  4.       <property name="dateFormat">  
  5.         <!-- 智能日期转换 -->  
  6.         <bean class="packageName.SmartDateFormat"/>  
  7.       </property>  
  8.     </bean>  
  9.   </property>  
  10. </bean>  
这段代码主要是针对MappingJacksonHttpMessageConverter进行配置。经过这样的配置之后,Spring就能自动根据日期样式进行转换了。


至于“智能”转换,完全就是简单的if/else判断,可以查看最上面的代码。

目录
相关文章
|
2月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
2月前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
87 2
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
58 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
136 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
4月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
172 0