HandlerMethodReturnValueHandler 實現(xiàn)api返回統(tǒng)一格式

1. 場景

在springmvc 的controller需要統(tǒng)一的返回接口骑祟,比如:需要在后臺所有接口返回統(tǒng)一的json字符串放坏∠耄可以通過自定義注解巩螃,通過 HandlerMethodReturnValueHandler 對返回值的處理甚淡,該接口會在返回值之前大诸,執(zhí)行該接口的內(nèi)部邏輯。

假設(shè)現(xiàn)在想返回一個接送字符串贯卦。格式:

{

status: 200

code : success

data :{

 age: 100,

 name : 小明

}

}

1. 創(chuàng)建返回結(jié)果類


public class ResponseResult<T> {

public Integer status;

    public String code;

    public   T data;

//  構(gòu)造 setter...

}

1. 創(chuàng)建一個返回結(jié)果的自定義注解包裝類:


public @Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface ResponseJson{

    public String className() default "ResponseResult"; // 全路徑名

}

2. 定義controller 邏輯资柔,假設(shè)有如下一個接口,我們需要對返回值進行包裝成ResponseResulltJson結(jié)構(gòu),加上自定義注解撵割。


@ResponseResulltJson

@GetMapping(“/test”)

public Student test(@RequestParam(value="name") String name){

      // 處理邏輯
     Student  student  = new Student();

    student.setName(name);

   return student;

}
  1. 創(chuàng)建HandlerMethodReturnValueHandler接口實現(xiàn)類,下面的o就是上面test接口的返回值贿堰。

public class ExampleHandler implements HandlerMethodReturnValueHandler {

    @Override

    publicboolean supportsReturnType(MethodParameter methodParameter) {

        return methodParameter.hasMethodAnnotation(ResponseJson.class);

    }

    @Override

    public void  handleReturnValue(Object o, MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,

NativeWebRequest nativeWebRequest)throws Exception {

    HttpServletResponse response = 
        nativeWebRequest.getNativeResponse(HttpServletResponse.class);

    response.setConentTpye(MediaType.APPLICATION_JSON_VALUE);

    response.setCharactrer("UTF-8");

    ResponseJson json = methodParameter.getAnnation(ResponseJson .class);

// 得到需要反射類對象,即結(jié)果類

    Class responseResult= json.className();

// 通過反射從構(gòu)造放入注入啡彬,需要注意羹与,通過構(gòu)造器注入的參數(shù)和newInstance傳入的必須一致。 

    Object rp = Class.forName(responseResult).getConstrtor(Object.class).newInstance(o);

// 通過guava中Gson來json化庶灿,或者FastJson

    Gson gson = new GSon();

    response.getWriter().write(gson.toJson(rp));

}

}

4. 把上面的的handler添加進RequestMappingHandlerAdapter適配器中

public class   RequestMappingHandlerAdapterWrapper{

    @Autowired

    private RequestMappingHandlerAdapter handlerAdapter;

    @PostConstruct

    public void register(){

                handlerAdapter.setReturnValueHandlers(new ArrayList<RequestMappingHandlerAdapter >({{

                this.add(new ExampleHandler ());

                this.addAll(RequestMappingHandlerAdapterWrapper.this.handlerAdapter.[getReturnValueHandlers](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.html#getReturnValueHandlers--)())纵搁;

    }}))

}

}

為什么上面這樣寫就可以在Controller中的返回結(jié)果調(diào)用到這個處理器。
在RequestMappingHandlerAdapter中實現(xiàn)了InitializingBean這個接口往踢,該接口具有唯一的函數(shù)AfterPropertiesSet(),意思是在容器啟動時腾誉,會調(diào)用這個方法,該方法主要設(shè)置了一些默認的handlers,在初始化方法中主要有三種利职,@PostContruct趣效、xml的init-method,實現(xiàn)InitalizingBean接口猪贪。這三種的執(zhí)行順序時@PostContruct英支、InitalizingBean、init-method,因此上面的register會先于AfterPropertiesSet方法執(zhí)行哮伟,自然可以在設(shè)置默認的handler時起作用干花。

Data:2019/3/10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市楞黄,隨后出現(xiàn)的幾起案子池凄,更是在濱河造成了極大的恐慌,老刑警劉巖鬼廓,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肿仑,死亡現(xiàn)場離奇詭異,居然都是意外死亡碎税,警方通過查閱死者的電腦和手機尤慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷蹂,“玉大人伟端,你說我怎么就攤上這事》嘶停” “怎么了责蝠?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萎庭。 經(jīng)常有香客問我霜医,道長,這世上最難降的妖魔是什么驳规? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任肴敛,我火速辦了婚禮,結(jié)果婚禮上吗购,老公的妹妹穿的比我還像新娘医男。我一直安慰自己,他們只是感情好巩搏,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布昨登。 她就那樣靜靜地躺著,像睡著了一般贯底。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天禽捆,我揣著相機與錄音笙什,去河邊找鬼。 笑死胚想,一個胖子當著我的面吹牛琐凭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浊服,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼统屈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牙躺?” 一聲冷哼從身側(cè)響起愁憔,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽拷,沒想到半個月后吨掌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡脓恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年膜宋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼幔。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡秋茫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乃秀,到底是詐尸還是另有隱情学辱,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布环形,位于F島的核電站策泣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抬吟。R本人自食惡果不足惜萨咕,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望火本。 院中可真熱鬧危队,春花似錦、人聲如沸钙畔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擎析。三九已至簿盅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桨醋。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工棚瘟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喜最。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓偎蘸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞬内。 傳聞我的和親對象是個殘疾皇子迷雪,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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