Srping Restful 接口返回值、异常统一处理

1、背景

    在项目开发中,很多时候会写一个restful接口,对于此类接口为了前端方便处理,会额外增加一些标识状态的字段,比如seccess、status等,或者异常信息,body为实际内容,比如以下bean:

public class MyRestfullBody<T> {

    private int status;
    private T body;
    private String msg;

}

    当然,完成这个功能的方式挺多的,现在我只是记录下RestControllerAdvice+ResponseBodyAdvice实现。

2、环境搭建

    我直接使用的Springboot、按照官网运行最简单的Springboot应用就ok了:

    POM

        143404_T035_2274659.png

        143440_kFQB_2274659.png

    启动类

    143536_xJy4_2274659.png

    运行结果:

            143749_6KhI_2274659.png

3、处理返回结果

   RestControllerAdvice通过表面意思就知道这个是对 RestController 的一些建议,对应的有 ControllerAdvice和 Controller 。 (RestController 可以简单的理解为 Controller +ResponseBody。)

     RestController 虽然没有显示的使用 ResponseBody ,实际上是使用了 ResponseBody 流程的,现在我们要做的就是在 RestControllerAdvice 加上 ResponseBodyAdvice:

    144815_kEvq_2274659.png

     ResponseBodyAdvice 这个接口有两个方法:

    144854_I4fi_2274659.png

      判断这个 Advice 适合那些 Controller ,返回true,代表所有。

      另一个方法就是我们要处理的核心了

       145203_MXRk_2274659.png

        看代码,就是把body封装了下,挺简单的。这儿有个主意点,就是图中的if,通过查看源码,Spring把String和其他对象分开处理的,如果body是String,封装后返回的对象会报ClassCaseException。

        重新运行,结果:

        145643_kPYI_2274659.png

        测试List:

        145714_h8Ck_2274659.png

        145757_l7lu_2274659.png

            结果满意。

4、异常处理

        异常处理借助ExceptionHandler,这个应该没问题,大多数人都会用

        在上面MyControllerAdvice类中加入:

        150225_VjcC_2274659.png

            测试代码:

            150254_5Sy2_2274659.png

                运行结果:

            150630_aMZI_2274659.png

           我对结果不咋满意。

            我改成了下面这种方式:

            150728_oCBj_2274659.png

         150755_PfDI_2274659.png

        运行结果:

        150840_Y227_2274659.png

        看上去还行:msg为异常消息,因为我这儿异常消息为空,所以是异常类名。

5、通过上面的方式,500异常算是处理了,现在谈谈404

    处理404可以实现ErrorController:

    151246_AXUI_2274659.png

    运行结果:(有问题哈,status为success)

    151313_kdR7_2274659.png

 

  

以上,希望能给你们提供一些帮助。

 

 

转载于:https://my.oschina.net/WXiaoqiang/blog/1504566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值