代码之家  ›  专栏  ›  技术社区  ›  SpringUser

@ExceptionHandler(Exception.class)不处理所有类型的异常

  •  11
  • SpringUser  · 技术社区  · 8 年前

    我正在尝试使用 @ExceptionHandler(Exception.class) .但它并不能处理所有类型的异常。

    当我试图从邮递员/浏览器中访问错误的HTTP方法时,我没有收到任何响应,空白页即将到来。

    请任何人告诉我为什么我没有得到任何回应,或者告诉我我的代码是否做错了什么?

        @Order(Ordered.HIGHEST_PRECEDENCE)
        @ControllerAdvice
        public class RestExceptionHandler extends ResponseEntityExceptionHandler {
    
    
            @ExceptionHandler(Exception.class)
            public ResponseEntity<ExceptionMessage> handleAllExceptionMethod(Exception ex,WebRequest requset,HttpServletResponse res) {
    
    
                ExceptionMessage exceptionMessageObj = new ExceptionMessage();
    
                exceptionMessageObj.setStatus(res.getStatus());
                exceptionMessageObj.setError(ex.getLocalizedMessage());     
                exceptionMessageObj.setException(ex.getClass().getCanonicalName());
                exceptionMessageObj.setPath(((ServletWebRequest) requset).getRequest().getServletPath());  
    
                return new ResponseEntity<ExceptionMessage>(exceptionMessageObj, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);          
            } 
    
    3 回复  |  直到 8 年前
        1
  •  3
  •   Karol Dowbecki    8 年前

    要么覆盖 ResponseEntityExceptionHandler#handleExceptionInternal() 或者不要延伸 ResponseEntityExceptionHandler .

    @Order(Ordered.HIGHEST_PRECEDENCE) 在 @ControllerAdvice 你以前应该工作吗 ResponseEntityExceptionHandler 根据 this answer 这表明需要Spring框架4.3.7。

        2
  •  1
  •   Maciej Kowalski    8 年前

    这将处理从控制器方法中引发的异常。

    如果您发送一个没有映射的请求,控制器方法将不会被调用,因此 @ExceptionHandler 在这种情况下将被淘汰。

    这篇关于创建自定义处理程序的文章可能会有所帮助: article

        3
  •  0
  •   ElChava    8 年前

    使用RequestMapping,您可以为每个Http代码创建不同的响应。在这个例子中,我展示了如何控制错误并给出相应的响应。

    这是带有服务规范的RestController

    @RestController
    public class User {
    
        @RequestMapping(value="/myapp/user/{id}", method = RequestMethod.GET)
        public ResponseEntity<String> getId(@PathVariable int id){
    
            if(id>10)
                throw new UserNotFoundException("User not found");
    
            return ResponseEntity.ok("" + id);
        }
    
        @ExceptionHandler({UserNotFoundException.class})
        public ResponseEntity<ErrorResponse> notFound(UserNotFoundException ex){
    
            return new ResponseEntity<ErrorResponse>(
                new ErrorResponse(ex.getMessage(), 404, "The user was not found") , HttpStatus.NOT_FOUND);
        }
    }
    

    如果customerId<10作为正文消息的一部分,它应该响应客户Id,但是当客户大于10时,应该抛出异常。在这种情况下,服务应该使用ErrorResponse进行响应。

    public class ErrorResponse {
    
        private String message;
        private int code;
        private String moreInfo;
    
        public ErrorResponse(String message, int code, String moreInfo) {
            super();
            this.message = message;
            this.code = code;
            this.moreInfo = moreInfo;
        }
    
        public String getMessage() {
    
            return message;
        }
    
        public int getCode() {
    
            return code;
        }
    
        public String getMoreInfo() {
    
            return moreInfo;
        }
    }
    

    最后,我使用一个特定的异常来表示“未找到”错误

    public class UserNotFoundException extends RuntimeException {
    
        public UserNotFoundException(String message) {
            super(message);
        }
    }