频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
解决spring boot中rest接口404,500等错误返回统一的json格式
2017-04-14 09:57:44         来源:AndyLizh的专栏  
收藏   我要投稿

解决spring boot中rest接口404,500等错误返回统一的json格式:在开发rest接口时,我们往往会定义统一的返回格式。{

  "status": true,
  "code": 200,
  "message": null,
  "data": [
    {
      "id": "101",
      "name": "jack"
    },
    {
      "id": "102",
      "name": "jason"
    }
  ]
}

但是如果调用方请求我们的api时把接口地址写错了,就会得到一个404错误,在传统的web系统中我们可自定义404错误页面,展示更友好。

在spring boot中其实也是返回了一个json格式的数据,如下:

{
  "timestamp": 1492063521109,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/rest11/auth"
}

告诉我们哪个地址是没找到,其实也挺友好的,但是因为我们上面自定义的数据格式跟下面的不一致,当用户拿到这个返回的时候是无法识别的,其中最明显的是status字段。

我们自定义的是boolean类型,表示是否成功

这边返回的就是http的状态码

所以我们需要在发生这种系统错误时也能返回我们自定义的那种格式

定义一个异常处理类

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 系统异常处理,比如:404,500
     * @param req
     * @param resp
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        logger.error("", e);
        ResponseData r = new ResponseData();
        r.setMessage(e.getMessage());
        if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
             r.setCode(404);
        } else {
             r.setCode(500);
        }
        r.setData(null);
        r.setStatus(false);
        return r;
    }
}

ResponseData是我们返回格式的实体类

这种在发生错误时这边会捕获到,然后封装好返回格式,返回给调用方

最后关键的一步是在spring boot的配置文件中加上如下配置:

#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
#不要为我们工程中的资源文件建立映射
spring.resources.add-mappings=false

然后我们调用一个不存在的接口时,返回的错误信息就是我们自定义的那种格式了

{
  "status": false,
  "code": 404,
  "message": "No handler found for GET /rest11/auth",
  "data": null
}
点击复制链接 与好友分享!回本站首页
上一篇:MyBatis关联关系查询 多对多表连接查询
下一篇:MyBatis之关联关系查询 多对一、多表单独查询
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站