创建拦截器类并标注@ControllerAdvice注解

@ControllerAdvicepublic class GlobalExceptionAdvice {    //处理未知异常    @ExceptionHandler(Exception.class)    @ResponseBody    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)    public UnifyResponse handleException(HttpServletRequest request, Exception e){        String method = request.getMethod();        String requestUrl = request.getRequestURI();        System.out.println(method);        System.out.println(requestUrl);        System.out.println(e);        UnifyResponse unifyResponse = new UnifyResponse(9999, "服务器异常", requestUrl + " " + method);        return unifyResponse;    }}
public class UnifyResponse {    private Integer code;    private String message;    private String request;    public UnifyResponse(Integer code, String message, String request) {        this.code = code;        this.message = message;        this.request = request;    }    public UnifyResponse(){    }    @Override    public String toString() {        return "UnifyResponse{" +                "code=" + code +                ", message='" + message + '\'' +                ", request='" + request + '\'' +                '}';    }    /**     * 使用抛出异常的方式表示请求成功     */    public static void crreateSuccess(){        throw new CreateSuccess(1);    }}

在类中创建对异常的处理方法

  • @ExceptionHandler:指出该方法会处理哪些异常。
  • @ResponseStats:指定返回前端的错误码。

通过request与exception参数可获得请求与异常信息,并决定返回前端的错误信息。
以上方法基本可以满足大部分需求,但对于灵活调整返回前端的http错误码还是不太方便,需要对应每个http错误码建立不同的处理方法。

实现决定返回前端的消息的http错误码

public class HttpException extends RuntimeException{    protected Integer code;    protected Integer httpStatusCode = 500;    public Integer getCode() {        return code;    }    public Integer getHttpStatusCode() {        return httpStatusCode;    }}
public class NotFoundException extends HttpException{    public NotFoundException(int code){        this.code = code;        this.httpStatusCode = 404;    }}

我采用创建一个Http异常基类继承RuntimeException,然后根据不同的http错误码创建不同的异常类实现HttpException,并传入自己的错误码,不传入错误码则默认使用500

@ExceptionHandler(HttpException.class)    public ResponseEntity handleHttpException(HttpServletRequest request, HttpException e){        String method = request.getMethod();        String requestUrl = request.getRequestURI();        UnifyResponse unifyResponse = new UnifyResponse(e.getCode(), requestUrl + " " + method);        HttpHeaders headers = new HttpHeaders();        headers.setContentType(MediaType.APPLICATION_JSON);        HttpStatus httpStatus = HttpStatus.resolve(e.getHttpStatusCode());        ResponseEntity<UnifyResponse> responseEntity = new ResponseEntity(unifyResponse, headers, httpStatus);        return responseEntity;    }

创建新的方法处理自定异常,为了改变返回消息的错误码需要设置http头部,并创建ResponseEntity将http头部与http错误码对象传入后返回。