zoukankan      html  css  js  c++  java
  • Spring MVC__自定义日期类型转换器

       WEB层采用Spring MVC框架,将查询到的数据传递给APP端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们。说真的,以前真没这样做过,之前都是一口气查询到数据,然后在jsp页面上格式化,最后展示给用户。但是这次不同,这次我纯属操作数据,没有页面。直接从数据库拿数据给它们返数据、它们给我传数据我持久化数据,说到这里一个小问题就默默的来了。

    首先把问题还原一下吧(这是一个数据导出功能),下图中用红框圈起来的都是直接从数据库中拿到的数据,但是不幸的是它们的对象中都包含日期类型的属性,然后我直接使用com.alibaba.fastjson.JSONObject将其转成json串返回给APP端和客户端,但是他们拿到的数据中时间类型的值都是时间戳,很不人性化,我也觉的很不人性化,就答应给他们格式化一下,不料,问题来了,格式化好之后然后又设置进去,结果是没用,没用,没用,重要的事情说三遍!

    解决上面出现的问题,格式化对象中的日期类型的属性值,然后返回给请求者。记住:这个动作是在服务器端完成,并且实体类和数据表中的类型也都不变,照样是日期类型的。

    第一步:首先自定义一个日期类型转换器(附代码)

     1 package com.tgsit.cjd.utils;
     3 /**
     4  * 日期类型转换器:
     5  *         自动格式化对象中的日期类型
     6  */
     8 import java.text.SimpleDateFormat;
     9 import java.util.Date;
    10 import java.util.Locale;
    12 import net.sf.json.JsonConfig;
    13 import net.sf.json.processors.JsonValueProcessor;
    15 public class JsonDateValueProcessor implements JsonValueProcessor{
    17     private String format ="yyyy-MM-dd";  
    19     public JsonDateValueProcessor() {  
    20         super();  
    21     }    
    23     public JsonDateValueProcessor(String format) {  
    24         super();  
    25         this.format = format;  
    26     } 
    28     @Override  
    29     public Object processArrayValue(Object paramObject,  
    30             JsonConfig paramJsonConfig) {  
    31         return process(paramObject);  
    32     }  
    34     @Override  
    35     public Object processObjectValue(String paramString, Object paramObject,  
    36             JsonConfig paramJsonConfig) {  
    37         return process(paramObject);  
    38     }    
    41     private Object process(Object value){  
    42         if(value instanceof Date){    
    43             SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.CHINA);    
    44             return sdf.format(value);  
    45         }    
    46         return value == null ? "" : value.toString();    
    47     }  
    49 }

    第二步:如果项目中没有引入json-lib包,则引入

    1 <dependency>
    2     <groupId>net.sf.json-lib</groupId>
    3     <artifactId>json-lib</artifactId>
    4     <version>2.4</version>
    5     <classifier>jdk15</classifier>
    6</dependency>

    第三步:返回数据之前先使用日期类型转换器格式化日期数据

    这里必须先创建JsonConfig对象,然后调用registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());方法将转换器注入进去,最后在调用JsonArray的formObject(数据,new JsonConfig())方法进行处理。

    注意:这里还有个小坑,就是当你处理的是单纯的一个实体对象,则直接可以jsonObject.formObject(数据,new JsonConfig());

    但是你处理的一个list集合数据时,则记得用jsonArray.formObject(数据,new JsonConfig());否则报错。

     1 @RequestMapping(value = "/exportInfo", method = RequestMethod.GET)
     2     @ResponseBody
     3     public String exportInfo(HttpServletResponse response) throws Exception{
     4         List<QueryVo> exportInfoList = queryVoService.exportInfo();
     5         if(exportInfoList != null && exportInfoList.size() > 0){
     6             List<Object> result = new ArrayList<Object>();
     7             JsonResult model = null;
     8             for (QueryVo queryVo : exportInfoList) {
     9                 OwnerInfo ownerInfo = ownerInfoService.selectOwnerInfoByVIN(queryVo.getVin());
    10                 List<MortgagerInfo> morInfoList = mortgagerInfoService.selectByVIN(queryVo.getVin());
    11                 List<TransferInfo> traInfoList = transferInfoService.selectByVIN(queryVo.getVin());
    12                 model = new JsonResult();
    13                 model.setOwnerInfo(ownerInfo);
    14                 model.setMortgagerInfo(morInfoList);
    15                 model.setTransferInfo(traInfoList);
    16                 result.add(model);
    17             }
    18             //调用自定义日期类型转换器,自动格式化对象中的日期类型的字段值
    19             JsonConfig jsonConfig = new JsonConfig();  
    20             jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
    21             return CGSConstants.returnJson(CGSConstants.SUCCESS,"导出成功",JSONArray.fromObject(result, jsonConfig));
    22         }
    23         return CGSConstants.returnJson(CGSConstants.SUCCESS,"尚无数据",null);
    24     }

      谢谢!

        

  • 相关阅读:
    1、Elasticsearch教程-从入门到精通
    3、ik分词器
    2、ElasticSearch的安装
    svn操作
    2020-10
    编写第一个linux驱动
    字符设备驱动
    Linux下/dev和/sys/class的区别
    latex
    Qt
  • 原文地址:https://www.cnblogs.com/1315925303zxz/p/6709703.html
Copyright © 2011-2022 走看看