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檢視:
- publicfinalclass Depot {
- publicinterface IOnlyIdView {}
-
publicinterface IOnlyNameView{}
- @JsonView(IOnlyIdView.class)
- privatelong id;
- @JsonView(IOnlyNameView.class)
- private String name;
- privatelong num;
- publiclong getId() {
- return id;
- }
- publicvoid setId(long id) {
- this.id = id;
- }
-
public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- publiclong getNum() {
- return num;
- }
- publicvoid setNum(long num) {
- this.num = num;
- }
- }
然後,定義Action的方法如下:
- @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
- @JsonView(Depot.IOnlyNameView.class)//定義不同的view 隱藏掉一些欄位
- public Depot getDepotInfo(@PathVariablelong id) {
- Depot depot = new Depot();
- depot.setId(100);
- depot.setName("北京001倉");
- depot.setNum(888);
- return depot;
- }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
則將專案執行之後結果列印(說明Depot的JsonView檢視生效):
{"name":"北京001倉"}將該方法getDepotInfo返回值改為List<Depot> ,方法註解不變,方法體改為
- Depot depot = new Depot();
- depot.setId(100);
- depot.setName("北京001倉");
- depot.setNum(888);
- List<Depot> ret = new ArrayList<>();
- ret.add(depot);
- return ret;
則將專案執行之後結果列印(說明放在集合容器中,JsonView檢視生效):
[{"name":"北京001倉"}]將該方法返回值改為JsonResult<Depot>,方法註解不變,方法體改為:
- depot.setId(100);
- depot.setName("北京001倉");
- depot.setNum(888);
- List<Depot> ret = new ArrayList<>();
- ret.add(depot);
- returnnew JsonResult(ret,true,"ok");
則將專案執行之後結果列印:
{}
JsonResult是我們架構設計中統一返回的類。所有VO都要放到該物件中返回。
JsonResult的定義如下:
- publicclass JsonResult<T> implements Serializable {
- privatestaticfinallong serialVersionUID = 3863559687276427577L;
- privateboolean success = true;
- public String message;
- private String secure;//安全憑據
- private T data;//資料
- public JsonResult() {
- }
- public JsonResult(T data, Boolean success, String message) {
- // TODO Auto-generated constructor stub
- this.data = data;
- this.success = success;
- this.message = message;
- }
- publicboolean isSuccess() {
- return success;
- }
- publicvoid setSuccess(boolean success) {
- this.success = success;
- }
- public T getData() {
- return data;
- }
- publicvoid setData(T data) {
- this.data = data;
- }
- public String getMessage() {
- return message;
- }
- publicvoid setMessage(String message) {
- this.message = message;
- }
- publicstatic <T> JsonResult<T> newResult() {
- returnnew JsonResult<T>();
- }
- public String getSecure() {
- return secure;
- }
- publicvoid setSecure(String secure) {
-
相關推薦
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技術深入淺出系列1:Azure Stack與Azure的有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:對象的個數確定可以使用數組,但是不確定怎麽辦?可以用集合。因為集合是可變