spring boot中自定义错误返回的json格式

开发接口时,对于数据的返回,我们会统一一个格式,方便调用接口的用户对数据进行处理,例如:

{
    "data": [
        {
            "ctime": "2018-12-14 16:46:56",
            "id": 1,
            "lat": 39.12,
            "lng": 117.2,
            "utime": "2018-12-17 17:17:42",
        }
    ],
    "code": 0,
    "msg": "OK"
}

调用人可以通过code来判断是否调用成功,并且通过msg查看结果信息。但是,当程序发生错误时,例如页面未找到404或者代码执行过程中出现错误异常没有进行捕获,在spring boot中返回了一个json格式的数据,如下:

{
    "timestamp": 1545184996402,
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/api/test"
}

这与我们定义的格式不一致。所以,这里就需要对改json的格式进行自定义。

 

第一步:

在spring boot的配置文件中添加下配置:

#页面未找到时抛出异常
spring.mvc.throw-exception-if-no-handler-found=true

第二步:

定义一个异常处理类

package com.ruixiude.cloud.wom;

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;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zgerbin
 * @date 2018/12/18 14:11
 * @description
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    /**
     * 全局异常
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map exceptionHandler(HttpServletRequest request, Exception e) {
        logger.error("", e);

        Map json = new HashMap();
        json.put("msg", e.getMessage());
        if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
            json.put("code", 404);
        } else {
            json.put("code", 500);
        }
        json.put("path", request.getRequestURI());
        return json;
    }
}

这样,当我们调用接口出现错误时,就会返回如下格式的json:

{
    "msg": "No handler found for GET /wom/api/test",
    "code": 404,
    "path": "/wom/api/test"
}

 

你可能感兴趣的:(SpringBoot)