Sfoglia il codice sorgente

优化异常信息处理逻辑

woody 1 anno fa
parent
commit
ff098d8a7e

+ 18 - 14
framework-base/src/main/java/com/chelvc/framework/base/interceptor/GlobalExceptionInterceptor.java

@@ -142,18 +142,19 @@ public class GlobalExceptionInterceptor extends AbstractErrorController {
     /**
      * 将异常转换成结果对象
      *
-     * @param e 异常对象
+     * @param request Http请求对象
+     * @param e       异常对象
      * @return 结果对象
      */
-    private Result<?> error2result(Throwable e) {
+    private Result<?> error2result(HttpServletRequest request, Throwable e) {
         if (e instanceof CompletionException) {
-            return this.error2result(e.getCause());
+            return this.error2result(request, e.getCause());
         } else if (e instanceof HttpRequestMethodNotSupportedException) {
-            return Result.build(HttpStatus.METHOD_NOT_ALLOWED);
+            return Result.build(HttpStatus.METHOD_NOT_ALLOWED, null, e.getMessage());
         } else if (e instanceof HttpMediaTypeNotAcceptableException) {
-            return Result.build(HttpStatus.NOT_ACCEPTABLE);
+            return Result.build(HttpStatus.NOT_ACCEPTABLE, null, e.getMessage());
         } else if (e instanceof HttpMediaTypeNotSupportedException) {
-            return Result.build(HttpStatus.UNSUPPORTED_MEDIA_TYPE);
+            return Result.build(HttpStatus.UNSUPPORTED_MEDIA_TYPE, null, e.getMessage());
         } else if (e instanceof HttpMessageNotReadableException) {
             Map<String, String> errors = this.format((HttpMessageNotReadableException) e);
             return CollectionUtils.isEmpty(errors) ? Result.build(HttpStatus.BAD_REQUEST) :
@@ -183,16 +184,16 @@ public class GlobalExceptionInterceptor extends AbstractErrorController {
             return Result.build(HttpStatus.PRECONDITION_FAILED, ImmutableMap.of(
                     ((MissingServletRequestPartException) e).getRequestPartName(), e.getMessage()
             ));
-        } else if (e instanceof ValidationException) {
+        } else if (e instanceof ValidationException || e instanceof TypeMismatchException
+                || e instanceof MultipartException || e instanceof HttpMessageConversionException
+                || e instanceof ServletRequestBindingException) {
             return Result.build(HttpStatus.BAD_REQUEST, null, e.getMessage());
-        } else if (e instanceof TypeMismatchException || e instanceof MultipartException
-                || e instanceof HttpMessageConversionException || e instanceof ServletRequestBindingException) {
-            return Result.build(HttpStatus.BAD_REQUEST);
         } else if (e instanceof FrameworkException) {
             FrameworkException exception = (FrameworkException) e;
             return Result.build(exception.getStatus(), exception.getData(), exception.getMessage());
         }
-        return Result.build(HttpStatus.INTERNAL_SERVER_ERROR);
+        boolean wrapping = SessionContextHolder.isResponseWrappingHeader(request);
+        return Result.build(HttpStatus.INTERNAL_SERVER_ERROR, null, wrapping ? null : e.getMessage());
     }
 
     /**
@@ -222,16 +223,19 @@ public class GlobalExceptionInterceptor extends AbstractErrorController {
     /**
      * 异常方法
      *
-     * @param request Http请求对象
+     * @param request  Http请求对象
+     * @param response Http响应对象
      * @return 异常结果
      */
     @RequestMapping("${server.error.path:${error.path:/error}}")
-    public Result<?> error(HttpServletRequest request) {
+    public Result<?> error(HttpServletRequest request, HttpServletResponse response) {
         HttpStatus status = this.getStatus(request);
         Map<String, Object> attributes = this.getErrorAttributes(request, this.options);
         String uri = (String) attributes.get("path");
         String message = (String) attributes.get("message");
         log.warn(SessionContextHolder.getLoggingMessage(uri, request.getMethod(), status.value(), message));
+        response.setStatus(status.value());
+        SessionContextHolder.initializeResponseWrappingHeader(response);
         return Result.build(status, null, message);
     }
 
@@ -245,7 +249,7 @@ public class GlobalExceptionInterceptor extends AbstractErrorController {
      */
     @ExceptionHandler(Exception.class)
     public Result<?> exception(HttpServletRequest request, HttpServletResponse response, Exception exception) {
-        Result<?> result = this.error2result(exception);
+        Result<?> result = this.error2result(request, exception);
         HttpStatus status = HttpUtils.getStatus(result.getCode());
         this.log(request, status, exception);
         response.setStatus(status.value());