springboot 全局异常处理

package com..web.advice;

import com.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Iterator;
import java.util.Set;


@ControllerAdvice(basePackages = {"com.web"})
@Slf4j
public class WebControllerAdvice {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    JsonResult handlerMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException exception) {
        log.error("Controller MethodArgumentNotValidException-Path:[{}],refer:{}", request.getRequestURI(), request.getHeader("referer"), exception);
        return getBindingResultErrorMessage(exception.getBindingResult());
    }

    @ExceptionHandler(BindException.class)
    @ResponseBody
    public JsonResult handleMethodBindException(HttpServletRequest request, BindException e) {
        log.error("Controller BindException-Path:{},refer:{}", request.getRequestURI(), request.getHeader("referer"));
        return getBindingResultErrorMessage(e.getBindingResult());
    }

    private JsonResult getBindingResultErrorMessage(BindingResult bindingResult2) {
        final BindingResult bindingResult = bindingResult2;
        return JsonResult.fail("500", bindingResult.getAllErrors().get(0).getDefaultMessage());
    }

    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    JsonResult handlerConstraintViolationException(HttpServletRequest request, ConstraintViolationException exception) {
        log.error("Controller ConstraintViolationException-Path:[{}]", request.getRequestURI(), exception);
        Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
        final Iterator<ConstraintViolation<?>> constraintViolationIterator = constraintViolations.iterator();
        if (constraintViolationIterator.hasNext()) {
            ConstraintViolation<?> constraintViolation = constraintViolationIterator.next();
            return JsonResult.fail("500", constraintViolation.getMessage());
        }
        return JsonResult.fail("500", "参数异常");
    }

    @ExceptionHandler(ServiceException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    JsonResult handleControllerServiceException(HttpServletRequest request, Throwable th) {
        ServiceException exception = (ServiceException) th;
        log.error("Controller ServiceException-Path:[{}]", request.getRequestURI(), th);
        return JsonResult.fail(exception.getCode(), exception.getMessage());
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    JsonResult handleControllerException(HttpServletRequest request, Throwable th) {
        HttpStatus status = getStatus(request);
        log.error("Controller Path: [{}]", request.getRequestURI(), th);
        return JsonResult.fail(status.toString(), "系统错误");
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }
}
原文地址:https://www.cnblogs.com/tiancai/p/14927119.html