【问题标题】:Spring boot - custom exceptions handlerSpring boot - 自定义异常处理程序
【发布时间】:2023-03-04 12:48:01
【问题描述】:

我正在使用 Spring Boot 开发一个休息应用程序。 此应用程序有一个自定义过滤器,仅在某些请求时允许访问。 如果用户需要特定资源,过滤器会抛出异常。 如何在全局级别处理此过滤器中生成的所有异常?

我尝试了@ControllerAdvice 注释,但不起作用。

【问题讨论】:

  • @ControllerAdvice 到底有什么不适合你的?您能否提供实现@ControllerAdvice 的异常处理程序的实现?另外,如果您只关心过滤器抛出的异常,为什么还需要全局处理?
  • 看看这个大概springboottutorial.com/…。顺便说一句,这对我有用@EnableWebMvc @ControllerAdvice public class ResourceExceptionHandlerImpl implements ResourceExceptionHandlerResourceExceptionHandler 是我的界面,不是 Spring。
  • 实际上,我认为您的情况有点不同,因为异常是在过滤器级别引发的,而不是在控制器级别。这里是类似的。问题stackoverflow.com/questions/34595605/…

标签: java rest spring-boot exception filter


【解决方案1】:

全局异常处理程序可以在 Spring Boot 中使用 @ControllerAdvice 注解实现。在 Spring Boot 中创建全局异常处理程序的完整源代码可用here

【讨论】:

    【解决方案2】:

    首先你可能有你自定义的异常处理类,它将替换默认的

    ResponseEntityExceptionHandler
    

    以下是我在学习期间使用的一个示例代码:

    @ControllerAdvice
    @RestController
    public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
            ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
            return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    
        @ExceptionHandler(UserNotFoundException.class)
        public final ResponseEntity<Object> handleUserNotFoundException(Exception ex, WebRequest request) {
            ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
            return new ResponseEntity<>(exceptionResponse, HttpStatus.NOT_FOUND);
        }
    
        @Override
        protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,               HttpHeaders headers, HttpStatus status, WebRequest request) {
            ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), "Validation Failed", ex.getBindingResult().toString());
            return new ResponseEntity<>(exceptionResponse, HttpStatus.BAD_REQUEST);
        }
    }
    

    然后,您可以添加自定义的异常并在需要时补充响应对象。

    请在here上找到其他类的完整代码

    【讨论】:

      【解决方案3】:

      首先,您应该创建一个自定义异常并从 runtimeException 扩展它

      public class CustomException extends RuntimeException
      {
          ...
      }
      

      然后你可以像这样抓住它

      @ControllerAdvice
      public class GlobalExceptionHandler {
      
          @ExceptionHandler(CustomException.class)
          public ResponseEntity handleCustomException(CustomException ex) {
                return ResponseHelper.response(ex.getData(), ex.getMsg(), 
               ex.getStatus());
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-10
        • 2022-10-19
        • 2015-10-18
        • 2022-01-12
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 2019-02-25
        相关资源
        最近更新 更多