天天看點

Spring MVC 更靈活的控制 json 傳回

這篇文章主要講 spring mvc 如何動态的去傳回 json 資料 在我們做 web 接口開發的時候, 經常會遇到這種場景。

兩個請求,傳回同一個對象,但是需要的傳回字段并不相同。如以下場景

spring mvc 預設使用轉json架構是 jackson。 大家也知道, jackson 可以在實體類内加注解,來指定序列化規則,但是那樣比較不靈活,不能實作我們目前想要達到的這種情況。

這篇文章主要講的就是通過自定義注解,來更加靈活,細粒化控制 json 格式的轉換。

最終我們需要實作如下的效果:

jackson 中, 我們可以通過 objectmapper.setfilterprovider 來進行過濾規則的設定,jackson 内置了一個 simplefilterprovider 過濾器,這個過濾器功能比較單一,不能很好的支援我們想要的效果。于是我自己實作了一個過濾器 jacksonjsonfilter

通過這個過濾器,我們可以實作

輸出結果

我們需要實作文章開頭的那種效果。這裡我自定義了一個注解,可以加在方法上,這個注解是用來攜帶參數給 customerjsonserializer.filter 方法的,就是某個類的某些字段需要過濾或者包含。這裡我們定義了兩個注解 @json 和 @jsons , 是為了放方法支援 多重 @json 注解

封裝 json 轉換

注解有了,過濾器也有了,那麼我們來封裝一個類,用作解析注解以及設定過濾器的。 customerjsonserializer.java

我們之前的 demo 可以變成:

handlermethodreturnvaluehandler 接口 spring mvc 用于處理請求傳回值 。 看一下這個接口的定義和描述,接口有兩個方法supportsreturntype 用來判斷 處理類 是否支援目前請求, handlereturnvalue 就是具體傳回邏輯的實作。

我們平時使用 @responsebody 就是交給 requestresponsebodymethodprocessor 這個類處理的

還有我們傳回 modelandview 的時候, 是由 modelandviewmethodreturnvaluehandler 類處理的

要實作文章開頭的效果,我實作了一個 jsonreturnhandler類,當方法有 @json 注解的時候,使用該類來處理傳回值。

通過這些,我們就可以最終實作以下效果。