diff --git a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/GlobalDefaultExceptionHandler.java b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/GlobalDefaultExceptionHandler.java index 4d5ce51da914e4d1395003308fa5bdeca83eab86..960afa2799eeef7d0400599a35c76be10521d5d0 100644 --- a/apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/GlobalDefaultExceptionHandler.java +++ b/apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/GlobalDefaultExceptionHandler.java @@ -3,6 +3,9 @@ package com.ctrip.framework.apollo.common.controller; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import com.ctrip.framework.apollo.common.exception.AbstractApolloHttpException; +import com.dianping.cat.Cat; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; @@ -15,9 +18,6 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.client.HttpStatusCodeException; -import com.ctrip.framework.apollo.common.exception.AbstractApolloHttpException; -import com.dianping.cat.Cat; - import java.lang.reflect.Type; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -34,74 +34,75 @@ import static org.springframework.http.MediaType.APPLICATION_JSON; @ControllerAdvice public class GlobalDefaultExceptionHandler { - private Gson gson = new Gson(); - private static Type mapType = new TypeToken>() {}.getType(); - - private static final Logger logger = LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class); - - //处理系统内置的Exception - @ExceptionHandler(Throwable.class) - public ResponseEntity> exception(HttpServletRequest request, Throwable ex) { - return handleError(request, INTERNAL_SERVER_ERROR, ex); - } - - @ExceptionHandler({HttpRequestMethodNotSupportedException.class, HttpMediaTypeException.class}) - public ResponseEntity> badRequest(HttpServletRequest request, - ServletException ex) { - return handleError(request, BAD_REQUEST, ex); - } - - @ExceptionHandler(HttpStatusCodeException.class) - public ResponseEntity> restTemplateException(HttpServletRequest request, - HttpStatusCodeException ex) { - return handleError(request, ex.getStatusCode(), ex); - } - - @ExceptionHandler(AccessDeniedException.class) - public ResponseEntity> accessDeny(HttpServletRequest request, - AccessDeniedException ex) { - return handleError(request, FORBIDDEN, ex); - } - - //处理自定义Exception - @ExceptionHandler({AbstractApolloHttpException.class}) - public ResponseEntity> badRequest(HttpServletRequest request, AbstractApolloHttpException ex) { - return handleError(request, ex); - } - - - private ResponseEntity> handleError(HttpServletRequest request, - AbstractApolloHttpException ex) { - return handleError(request, ex.getHttpStatus(), ex); - } - - - private ResponseEntity> handleError(HttpServletRequest request, - HttpStatus status, Throwable ex) { - String message = ex.getMessage(); - - logger.error(message, ex); - Cat.logError(ex); - - - Map errorAttributes = new HashMap<>(); - - //如果是admin server引起的异常,则显示内部的异常信息 - if (ex instanceof HttpStatusCodeException){ - errorAttributes = gson.fromJson(((HttpStatusCodeException)ex).getResponseBodyAsString(), mapType); - status = ((HttpStatusCodeException)ex).getStatusCode(); - } else { - errorAttributes.put("status", status.value()); - errorAttributes.put("message", message); - errorAttributes.put("timestamp", - LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); - errorAttributes.put("exception", ex.getClass().getName()); - - } - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(APPLICATION_JSON); - return new ResponseEntity<>(errorAttributes, headers, status); - } + private Gson gson = new Gson(); + private static Type mapType = new TypeToken>() { + }.getType(); + + private static final Logger logger = LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class); + + //处理系统内置的Exception + @ExceptionHandler(Throwable.class) + public ResponseEntity> exception(HttpServletRequest request, Throwable ex) { + return handleError(request, INTERNAL_SERVER_ERROR, ex); + } + + @ExceptionHandler({HttpRequestMethodNotSupportedException.class, HttpMediaTypeException.class}) + public ResponseEntity> badRequest(HttpServletRequest request, + ServletException ex) { + return handleError(request, BAD_REQUEST, ex); + } + + @ExceptionHandler(HttpStatusCodeException.class) + public ResponseEntity> restTemplateException(HttpServletRequest request, + HttpStatusCodeException ex) { + return handleError(request, ex.getStatusCode(), ex); + } + + @ExceptionHandler(AccessDeniedException.class) + public ResponseEntity> accessDeny(HttpServletRequest request, + AccessDeniedException ex) { + return handleError(request, FORBIDDEN, ex); + } + + //处理自定义Exception + @ExceptionHandler({AbstractApolloHttpException.class}) + public ResponseEntity> badRequest(HttpServletRequest request, AbstractApolloHttpException ex) { + return handleError(request, ex); + } + + + private ResponseEntity> handleError(HttpServletRequest request, + AbstractApolloHttpException ex) { + return handleError(request, ex.getHttpStatus(), ex); + } + + + private ResponseEntity> handleError(HttpServletRequest request, + HttpStatus status, Throwable ex) { + String message = ex.getMessage(); + + logger.error(message, ex); + Cat.logError(ex); + + + Map errorAttributes = new HashMap<>(); + + //如果是admin server引起的异常,则显示内部的异常信息 + if (ex instanceof HttpStatusCodeException) { + errorAttributes = gson.fromJson(((HttpStatusCodeException) ex).getResponseBodyAsString(), mapType); + status = ((HttpStatusCodeException) ex).getStatusCode(); + } else { + errorAttributes.put("status", status.value()); + errorAttributes.put("message", message); + errorAttributes.put("timestamp", + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + errorAttributes.put("exception", ex.getClass().getName()); + + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(APPLICATION_JSON); + return new ResponseEntity<>(errorAttributes, headers, status); + } }