package com.oying.exception.handler;
|
|
import com.oying.exception.EntityExistException;
|
import com.oying.exception.EntityNotFoundException;
|
import lombok.extern.slf4j.Slf4j;
|
import com.oying.exception.BadRequestException;
|
import com.oying.utils.ThrowableUtil;
|
import org.springframework.http.ResponseEntity;
|
import org.springframework.security.authentication.BadCredentialsException;
|
import org.springframework.validation.FieldError;
|
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 static org.springframework.http.HttpStatus.*;
|
|
/**
|
* @author Z
|
* @date 2018-11-23
|
*/
|
@Slf4j
|
@RestControllerAdvice
|
public class GlobalExceptionHandler {
|
|
/**
|
* 处理所有不可知的异常
|
*/
|
@ExceptionHandler(Throwable.class)
|
public ResponseEntity<ApiError> handleException(Throwable e){
|
// 打印堆栈信息
|
log.error(ThrowableUtil.getStackTrace(e));
|
return buildResponseEntity(ApiError.error(e.getMessage()));
|
}
|
|
/**
|
* BadCredentialsException
|
*/
|
@ExceptionHandler(BadCredentialsException.class)
|
public ResponseEntity<ApiError> badCredentialsException(BadCredentialsException e){
|
// 打印堆栈信息
|
String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage();
|
log.error(message);
|
return buildResponseEntity(ApiError.error(message));
|
}
|
|
/**
|
* 处理自定义异常
|
*/
|
@ExceptionHandler(value = BadRequestException.class)
|
public ResponseEntity<ApiError> badRequestException(BadRequestException e) {
|
// 打印堆栈信息
|
log.error(ThrowableUtil.getStackTrace(e));
|
return buildResponseEntity(ApiError.error(e.getStatus(),e.getMessage()));
|
}
|
|
/**
|
* 处理 EntityExist
|
*/
|
@ExceptionHandler(value = EntityExistException.class)
|
public ResponseEntity<ApiError> entityExistException(EntityExistException e) {
|
// 打印堆栈信息
|
log.error(ThrowableUtil.getStackTrace(e));
|
return buildResponseEntity(ApiError.error(e.getMessage()));
|
}
|
|
/**
|
* 处理 EntityNotFound
|
*/
|
@ExceptionHandler(value = EntityNotFoundException.class)
|
public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) {
|
// 打印堆栈信息
|
log.error(ThrowableUtil.getStackTrace(e));
|
return buildResponseEntity(ApiError.error(NOT_FOUND.value(),e.getMessage()));
|
}
|
|
/**
|
* 处理所有接口数据验证异常
|
*/
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
public ResponseEntity<ApiError> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
|
// 打印堆栈信息
|
log.error(ThrowableUtil.getStackTrace(e));
|
ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
|
String message = objectError.getDefaultMessage();
|
if (objectError instanceof FieldError) {
|
message = ((FieldError) objectError).getField() + ": " + message;
|
}
|
return buildResponseEntity(ApiError.error(message));
|
}
|
|
/**
|
* 统一返回
|
*/
|
private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
|
return new ResponseEntity<>(apiError, valueOf(apiError.getStatus()));
|
}
|
}
|