package me.zhengjie.common.exception.handler; import lombok.extern.slf4j.Slf4j; import me.zhengjie.common.exception.BadRequestException; import me.zhengjie.common.exception.EntityExistException; import me.zhengjie.common.exception.EntityNotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.io.PrintWriter; import java.io.StringWriter; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.FORBIDDEN; import static org.springframework.http.HttpStatus.NOT_FOUND; /** * @author jie * @date 2018-11-23 */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /** * 处理所有不可知的异常 * @param e * @return * / @ExceptionHandler (. Exception class ) public ResponseEntity handleException (Exception E) { // print stack information log.error (getStackTrace (E)); of ApiError apiError = new new of ApiError (BAD_REQUEST.value (), e.getMessage ( )); return buildResponseEntity (apiError); } / ** * no access exception processing interface AccessDeniedException is * @param E * @return * / . @ExceptionHandler (AccessDeniedException is class ) publicHandleAccessDeniedException ResponseEntity (AccessDeniedException is E) { // print stack information log.error (getStackTrace (E)); of ApiError apiError = new new of ApiError (FORBIDDEN.value (), e.getMessage ()); return buildResponseEntity (apiError); } / * * * custom exception handling * @param E * @return * / @ExceptionHandler (value = BadRequestException. class ) public ResponseEntity <of ApiError> badRequestException (BadRequestException E) { // print stack information log.error(getStackTrace(e)); ApiError apiError = new ApiError(e.getStatus(),e.getMessage()); return buildResponseEntity(apiError); } /** * 处理 EntityExist * @param e * @return */ @ExceptionHandler(value = EntityExistException.class) public ResponseEntity<ApiError> entityExistException(EntityExistException e) { // 打印堆栈信息 log.error(getStackTrace(e)); ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage()); return buildResponseEntity(apiError); } /** * 处理 EntityNotFound * @param e * @return */ @ExceptionHandler(value = EntityNotFoundException.class) public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) { // 打印堆栈信息 log.error(getStackTrace(e)); ApiError apiError = new ApiError(NOT_FOUND.value(),e.getMessage()); return buildResponseEntity(apiError); } / ** * All processing interface data validation exception * @param E * @Returns * / @ExceptionHandler (MethodArgumentNotValidException. Class ) public ResponseEntity <of ApiError> handleMethodArgumentNotValidException (MethodArgumentNotValidException E) { // print stack information log.error (getStackTrace (e )); String [] STR = e.getBindingResult () getAllErrors () GET (0) .getCodes () [. 1] .split ( "\\.".. ); the StringBuffer MSG = new new the StringBuffer (STR [. 1] + ":" ); .. msg.append (e.getBindingResult () getAllErrors () GET ( 0 ) .getDefaultMessage ()); ApiError apiError = new ApiError(BAD_REQUEST.value(),msg.toString()); return buildResponseEntity(apiError); } /** * 统一返回 * @param apiError * @return */ private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) { return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus())); } /** * 获取堆栈信息 * @param throwable * @return */ private String getStackTrace(Throwable throwable) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); try { throwable.printStackTrace(pw); return "\n"+sw.toString(); } finally { pw.close(); } } }
package me.zhengjie.common.exception.handler; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.time.LocalDateTime; /** * @author jie * @date 2018-11-23 */ @Data class ApiError { private Integer status; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime timestamp; private String message; private ApiError() { timestamp = LocalDateTime.now(); } public ApiError(Integer status,String message) { this(); this.status = status; this.message = message; } }