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判断,可以查看最上面的代码。

目录
相关文章
|
6月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
340 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
2月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
375 3
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
512 0
|
6月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
336 0
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
285 0
|
6月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
220 0
|
2月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
194 0
|
2月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
115 0
|
2月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
173 0
|
6月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——定义返回的统一 json 结构
本课主要讲解Spring Boot中的全局异常处理方法。在项目开发中,各层操作难免会遇到各种异常,若逐一处理将导致代码耦合度高、维护困难。因此,需将异常处理从业务逻辑中分离,实现统一管理与友好反馈。本文通过定义一个简化的JsonResult类(含状态码code和消息msg),结合全局异常拦截器,展示如何封装并返回标准化的JSON响应,从而提升代码质量和用户体验。
147 0

热门文章

最新文章