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     }

 

  謝謝!

 

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM