1. 程式人生 > >SpringMvc4.1:註解JsonView與泛型返回類

SpringMvc4.1:註解JsonView與泛型返回類

前段時間,因工作需要,要做一個WEB層,放在展示層(HTML,JS,移動端)和服務層(DubboX)中間,使用JSON暴露資料給展示層。經過一番調研,決定使用SpringMVC4.1.6+Jackson2.5.1來搭建此專案。


常規搭建略去不提,因為用的是SpringMVC4.1以上的版本,因此決定在返回JSON資料的時候,使用新註解@JsonView來支援同一個VO顯示不同的JSON檢視,其目的主要是隱藏VO中的敏感欄位,節約流量,減少不必要欄位輸出,方便展示層(JS)處理。框架搭建過程很順利,但在返回封裝好的泛型JSON類的時候,出現了問題,即泛型屬性物件在指定JsonView的檢視之後渲染失敗。經過對Jackson原始碼的初步瀏覽和跟蹤,終於找到問題所在,現將解決過程總結在此。

問題描述:

JsonView使用分為三步:
1:定義view相關介面。
2:在VO的屬性上使用JsonView註解,此為定義階段,此步可以和第一步放在一起。
3:在Action的方法上使用JsonView註解,此為使用階段。


首先,

定義VO如下,同時在VO裡面定義了兩個介面(IOnlyIdView ,IOnlyIdView)用於顯示不同JSON檢視:

  1. publicfinalclass Depot {  
  2.     publicinterface IOnlyIdView {}  
  3.     publicinterface IOnlyNameView{}  
  4.     @JsonView(IOnlyIdView.class)  
  5.     privatelong id;  
  6.     @JsonView(IOnlyNameView.class)  
  7.     private String name;  
  8.     privatelong num;  
  9.     publiclong getId() {  
  10.         return id;  
  11.     }  
  12.     publicvoid setId(long id) {  
  13.         this.id = id;  
  14.     }  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     publicvoid setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     publiclong getNum() {  
  22.         return num;  
  23.     }  
  24.     publicvoid setNum(long num) {  
  25.         this.num = num;  
  26.     }  
  27. }  

然後,定義Action的方法如下:

  1. @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})  
  2. @JsonView(Depot.IOnlyNameView.class)//定義不同的view 隱藏掉一些欄位
  3. public Depot getDepotInfo(@PathVariablelong id) {  
  4.     Depot depot = new Depot();  
  5.     depot.setId(100);  
  6.     depot.setName("北京001倉");  
  7.     depot.setNum(888);  
  8.     return depot;  
  9. }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>  

則將專案執行之後結果列印(說明Depot的JsonView檢視生效):

{"name":"北京001倉"}

將該方法getDepotInfo返回值改為List<Depot> ,方法註解不變,方法體改為

  1. Depot depot = new Depot();  
  2. depot.setId(100);  
  3. depot.setName("北京001倉");  
  4. depot.setNum(888);  
  5. List<Depot> ret = new ArrayList<>();  
  6. ret.add(depot);  
  7. return ret;  

則將專案執行之後結果列印(說明放在集合容器中,JsonView檢視生效):

[{"name":"北京001倉"}]


將該方法返回值改為JsonResult<Depot>,方法註解不變,方法體改為:
  1. depot.setId(100);  
  2. depot.setName("北京001倉");  
  3. depot.setNum(888);  
  4. List<Depot> ret = new ArrayList<>();  
  5. ret.add(depot);  
  6. returnnew JsonResult(ret,true,"ok");  


則將專案執行之後結果列印:
{}

JsonResult是我們架構設計中統一返回的類。所有VO都要放到該物件中返回。

JsonResult的定義如下:

  1. publicclass JsonResult<T> implements Serializable {  
  2.     privatestaticfinallong serialVersionUID = 3863559687276427577L;  
  3.     privateboolean success = true;  
  4.     public String message;  
  5.     private String secure;//安全憑據
  6.     private T data;//資料
  7.     public JsonResult() {  
  8.     }  
  9.     public JsonResult(T data, Boolean success, String message) {  
  10.         // TODO Auto-generated constructor stub
  11.         this.data = data;  
  12.         this.success = success;  
  13.         this.message = message;  
  14.     }  
  15.     publicboolean isSuccess() {  
  16.         return success;  
  17.     }  
  18.     publicvoid setSuccess(boolean success) {  
  19.         this.success = success;  
  20.     }  
  21.     public T getData() {  
  22.         return data;  
  23.     }  
  24.     publicvoid setData(T data) {  
  25.         this.data = data;  
  26.     }  
  27.     public String getMessage() {  
  28.         return message;  
  29.     }  
  30.     publicvoid setMessage(String message) {  
  31.         this.message = message;  
  32.     }  
  33.     publicstatic <T> JsonResult<T> newResult() {  
  34.         returnnew JsonResult<T>();  
  35.     }  
  36.     public String getSecure() {  
  37.         return secure;  
  38.     }  
  39.     publicvoid setSecure(String secure) {  
  40. 相關推薦

    SpringMvc4.1註解JsonView返回

    前段時間,因工作需要,要做一個WEB層,放在展示層(HTML,JS,移動端)和服務層(DubboX)中間,使用JSON暴露資料給展示層。經過一番調研,決定使用SpringMVC4.1.6+Jackson2.5.1來搭建此專案。 常規搭建略去不提,因為用的是S

    集合--Map的使用方法--例子

    package com.test.collection; import java.util.Collection; import java.util.HashMap; import java.util

    C#非集合集合的區別

    C# 泛型集合之非泛型集合類與泛型集合類的對應: ArrayList對應List HashTable對應Dictionary Queue對應Queue Stack對應Stack SortedList對應SortedList C# 集合類 Array Arraylist L

    模板編程1(函數模板)

    開始 name 對象 AC pan pen != 函數的參數 接受 定義、實例化函數模板: 對於函數體完全相同,唯一差異就是參數類型的情況,我們可以定義一個通用的函數模板,而非為每個類型都定義一個新函數: 1 #include <iostream> 2

    《Effective C++》模板程式設計條款32-條款40

    條款41:瞭解隱式介面和編譯期多型 class支援顯示介面和執行期多型 class的顯示介面由函式的名籤式構成(函式名稱、引數型別、返回型別) class的多型通過virtual函式發生在執行期 template支援隱式介面和編譯期多型 templa

    《C++primer(第五版)》學習之路-第十六章模板程式設計

    【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 16.1 定義模板 1.模板定義以關鍵字template開始,後跟一個模板引數列表,這是一個逗號分隔的一個或多個模板引數的列表,用小於號(<)和大於號(&

    Java進階學習之集合1

    [TOC](目錄) ## 1.集合 #### 1.1.集合是什麼 之前的基礎篇中我們知道了一種資料結構:陣列,可以存放很多資料。但是資料有很大的侷限性: - 支援的資料型別單一 - 宣告時需要指定大小,大小固定,可擴充套件性差 - 連續的儲存單元,對記憶體要求苛刻 那麼是否有其他的資料結構或者資料型

    c++--模板編程

    編譯 string std size_t har rom 數組大小 傳遞 成員函數 一、定義模板 1.1 函數模板 1. 適用情況:如果兩個函數幾乎是相同的,唯一的差異是參數的類型,函數體則完全一樣。 2. 定義 template <模板參數列表(以逗號分隔)&g

    Azure Stack技術深入淺出系列1Azure StackAzure的有QoS保證的網絡聯通實現方法和對比測試

    azure stack 雲計算 微軟 azure源自Azure的Azure stack作為一款業界唯一的和領先的公有雲平臺一致的混合雲平臺,能夠幫助企業客戶從自有數據中心交付Azure雲服務。它作為微軟混合雲戰略中的重頭戲,官方宣稱其將在今年年中GA了。上海儀電集團高度重視這一產品,同時成立了一個專門的團隊來

    Head first java chapter 16 集合(數據結構)

    技術分享 rst image 結構 logs ges nbsp alt log Head first java chapter 16 集合與泛型(數據結構)

    java week 9----- 集合

    評估 -m 正常 面向對象思想 acm 元素 篩選 -o 內容 1. 本周學習總結 1.1 以你喜歡的方式(思維導圖或其他)歸納總結集合與泛型相關內容。 2. 書面作業 本次作業題集集合 1. List中指定元素的刪除(題集題目) 1.1 實驗總結。並回答:列舉至少2種在

    【轉】編寫高質量代碼改善C#程序的157個建議——建議35使用default為變量指定初始值

    如果 items item 類型變量 color 高質量 使用 per match 建議35:使用default為泛型類型變量指定初始值 有些算法,比如泛型集合List<T>的Find算法,所查找的對象可能會是值類型,也有可能是引用類型。在這種算法內部,我

    Boolan C++ STL編程 二

    push_back 使用 功能 lan 鏈表排序 移動元素 直接 雙向鏈表 末尾 本周主要是講解了容器list的使用 List是一種可在常數時間內在任何位置執行插入和刪除操作的順序容器。list是雙向鏈表,其叠代器是雙向的。與其他順序容器(array, vector, d

    集合典型例題

    得到 一個 i++ 處理 控制臺輸出 通過 功能 說明 題目 1、數制轉換問題。數制轉換問題是將任意一個非負的十進制數轉換為其它進制的數,這是計算機實現計算的基本問題。其一般的解決方法的利用輾轉相除法。以將一個十進制數N轉換為八進制數為例進行說明。假設N=5142,示例圖:

    Java數組(1)數組多維數組

    soft arr ring 基本 int div 標識 apple 矩陣 我們對數組的基本看法是,你可以創建它們,通過使用整型索引值訪問它們的元素,並且他們的尺寸不能改變。 但是有時候我們需要評估,到底是使用數組還是更加靈活的工具。數組是一個簡單的線性序列,這使得元素訪問非

    Boolan STL編程第三周筆記

    line 不用 無法 word use log push_back 刪除 從後往前 對於本周老師講的內容,C++ Primer上面有第十一章關聯容器的習題可以做。有一些地方還是不懂,搞明白了再寫上來。 P422 E11.4 //P422 E11.4 #include<

    【C++ Primer 第16章】《模板編程》目錄

    cnblogs OS pan c++ get In lan microsoft .cn 模板與泛型編程 • 定義模板(16.1) 類模板(16.1.2) 類前置聲明範例 •【C

    Effective C++: 07模板編程

    單向 不可 允許 non-const 內容 卷標 基類 complete ear C++ template機制自身是一部完整的圖靈機(Turing-complete):它可以被用來計算任何可計算的值。於是導出了模板元編程(TMP, template metaprogramm

    Python3學習筆記1變量和簡單數據

    tle 小數點 per port 小數 指導 day this python 2018-09-16 17:22:11 變量聲明:   變量名 = ?? 如: 1 message = "HelloWorld" 2 message = 1 3 message =

    集合框架

    元素存在 lse 鍵值對 tree 二分 support linked tor efi 集合框架:★★★★★,用於存儲數據的容器。 特點: 1:對象封裝數據,對象多了也需要存儲。集合用於存儲對象。 2:對象的個數確定可以使用數組,但是不確定怎麽辦?可以用集合。因為集合是可變