全局异常处理类
package com.um.dmp.costaccounting.common.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
@RestControllerAdvice
@Slf4j
public class ExceptionAdvice {
/**
* 处理自定义异常
*
* @param systemException SystemException
* @return Response
*/
@ExceptionHandler(SystemException.class)
public Response handleSystemException(SystemException systemException) {
log.error(systemException.getMessage(), systemException);
return Response.error(systemException.getCode(), systemException.getMessage());
}
/**
* 处理参数校验异常,适用于:@Validated 、 非Java bean
*
* @param constraintViolationException ConstraintViolationException
* @return Response
*/
@ExceptionHandler(ConstraintViolationException.class)
public Response handleConstraintViolationException(ConstraintViolationException constraintViolationException) {
log.error(constraintViolationException.getMessage(), constraintViolationException);
String message = constraintViolationException.getConstraintViolations().stream()
.map(ConstraintViolation::getMessage)
.distinct()
.reduce((a, b) -> a + "," + b)
.orElse("未知参数异常");
return Response.error(ResponseEnum.ERROR.getCode(), message);
}
/**
* 处理参数校验异常,适用于:@Valid 、 @RequestBody、Java bean 、表单(Content-Type: application/json、Content-Type: application/xml)
*
* @param methodArgumentNotValidException MethodArgumentNotValidException
* @return Response
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Response handleMethodArgumentNotValidException(MethodArgumentNotValidException methodArgumentNotValidException) {
log.error(methodArgumentNotValidException.getMessage(), methodArgumentNotValidException);
String message = methodArgumentNotValidException.getBindingResult().getAllErrors()
.stream().map(ObjectError::getDefaultMessage)
.distinct()
.reduce((a, b) -> a + "," + b)
.orElse("未知参数异常");
return Response.error(ResponseEnum.ERROR.getCode(), message);
}
/**
* 处理参数校验异常,适用于:@Valid 、 Java bean 、表单(Content-Type: multipart/form-data)
*
* @param bindException BindException
* @return Response
*/
@ExceptionHandler(BindException.class)
public Response handleBindException(BindException bindException) {
log.error(bindException.getMessage(), bindException);
String message = bindException.getBindingResult().getAllErrors()
.stream().map(ObjectError::getDefaultMessage)
.distinct()
.reduce((a, b) -> a + "," + b)
.orElse("未知参数异常");
return Response.error(ResponseEnum.ERROR.getCode(), message);
}
/**
* 兜底异常处理
*
* @param exception Exception
* @return Response
*/
@ExceptionHandler(Exception.class)
public Response handleException(Exception exception) {
exception.printStackTrace();
log.error(exception.getMessage(), exception);
return Response.error(ResponseEnum.ERROR);
}
}