如何實現(xiàn)SpringMVC的Body參數(shù)攔截匿垄?

SpringMVC對出參和入?yún)⒂蟹浅S押玫耐卣怪С?方便你對數(shù)據(jù)的輸入和輸出有更大的執(zhí)行權(quán)递惋,我們?nèi)绾瓮ㄟ^SpringMVC定義的結(jié)果做一系列處理呢畸肆?

入?yún)?/h3>

RequestBodyAdvice : 針對所有以@RequestBody的參數(shù)做處理

參考案例 : JsonViewRequestBodyAdvice

public class JsonViewRequestBodyAdvice extends RequestBodyAdviceAdapter {

    /**
     * 這里是一個前置攔截匹配操作,其實就是告訴你滿足為true的才會執(zhí)行下面的beforeBodyRead方法,這里可以定義自己業(yè)務相關的攔截匹配
     * @param methodParameter
     * @param targetType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType,
            Class<? extends HttpMessageConverter<?>> converterType) {

        return (AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType) &&
                methodParameter.getParameterAnnotation(JsonView.class) != null);
    }

        // 這里就是具體的前置操作了... 下面的例子就是查找這個入?yún)⒎椒ㄊ欠裼蠤JsonView修飾
    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter,
            Type targetType, Class<? extends HttpMessageConverter<?>> selectedConverterType) throws IOException {

        JsonView annotation = methodParameter.getParameterAnnotation(JsonView.class);
        Class<?>[] classes = annotation.value();
        if (classes.length != 1) {
            throw new IllegalArgumentException(
                    "@JsonView only supported for request body advice with exactly 1 class argument: " + methodParameter);
        }
        return new MappingJacksonInputMessage(inputMessage.getBody(), inputMessage.getHeaders(), classes[0]);
    }

}
復制代碼

出參

ResponseBodyAdvice: 針對所有以@ResponseBody的參數(shù)做處理

參考案例:

@ControllerAdvice
public class LogResponseBodyAdvice implements ResponseBodyAdvice {

    /**
     *
     * @param returnType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
       // 做任何事情 body 就是返回的結(jié)果對象,沒有處理之前
        return body; 
    }
}
復制代碼

注意事項

自定義的處理對象類上必須得加上@ControllerAdvice注解!
為什么?
源碼中RequestMappingHandlerAdapter類在執(zhí)行initControllerAdviceCache()做初始化的時候會執(zhí)行一個

List<ControllerAdviceBean> beans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());
AnnotationAwareOrderComparator.sort(beans);
復制代碼

而ControllerAdviceBean.findAnnotatedBeans方法會查找類上有ControllerAdvice注解的類才會加入到處理當中..

public static List<ControllerAdviceBean> findAnnotatedBeans(ApplicationContext applicationContext) {
        List<ControllerAdviceBean> beans = new ArrayList<ControllerAdviceBean>();
        for (String name : BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class)) {
            if (applicationContext.findAnnotationOnBean(name, ControllerAdvice.class) != null) {
                beans.add(new ControllerAdviceBean(name, applicationContext));
            }
        }
        return beans;
    }
復制代碼

所以大家可以根據(jù)自己的需要,定義結(jié)果的入?yún)⒑统鰠⒔Y(jié)果做一些特殊處理.....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末访惜,一起剝皮案震驚了整個濱河市嘹履,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌债热,老刑警劉巖砾嫉,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窒篱,居然都是意外死亡焕刮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門墙杯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來配并,“玉大人,你說我怎么就攤上這事高镐「刃” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵嫉髓,是天一觀的道長观腊。 經(jīng)常有香客問我邑闲,道長,這世上最難降的妖魔是什么梧油? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任苫耸,我火速辦了婚禮,結(jié)果婚禮上婶溯,老公的妹妹穿的比我還像新娘鲸阔。我一直安慰自己,他們只是感情好迄委,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布褐筛。 她就那樣靜靜地躺著,像睡著了一般叙身。 火紅的嫁衣襯著肌膚如雪渔扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天信轿,我揣著相機與錄音晃痴,去河邊找鬼。 笑死财忽,一個胖子當著我的面吹牛倘核,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播即彪,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼紧唱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隶校?” 一聲冷哼從身側(cè)響起漏益,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎深胳,沒想到半個月后绰疤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡舞终,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年轻庆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敛劝。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨了,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攘蔽,到底是詐尸還是另有隱情龙屉,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站转捕,受9級特大地震影響作岖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜五芝,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一痘儡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枢步,春花似錦沉删、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隘擎,卻和暖如春殴穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背货葬。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工采幌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人震桶。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓休傍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹲姐。 傳聞我的和親對象是個殘疾皇子尊残,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容