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); } }