Spring过滤器抛出自定义异常

时间:2016-12-06 03:40:50

标签: java spring spring-mvc servlet-filters

我有一个控制器建议,可以处理我的应用程序抛出的所有验证异常,如下所示。

@RestControllerAdvice
public class RestApiExceptionController {

    @ExceptionHandler(ValidationErrorException.class)
    public ResponseEntity<?> appNotFoundException(ValidationErrorException exception) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(new ErrorResponse(exception.getErrorCode(), exception.getMessage())); 
    }
}

在我的方式中,我想创建一个过滤器,它将对每个请求进行验证,并在必要时抛出自定义异常。但问题是我不能抛出自定义异常,如下图所示。

public class ValidationFilter implements Filter {
    ...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        throw new ValidationErrorException(); // This is impossible
    }
    ...
}

在这种情况下如何抛出ValidationErrorException,或者还有其他更好的方法来处理这样的任务。

1 个答案:

答案 0 :(得分:3)

验证通常在请求对象上完成,这些请求对象在Controller层中从请求格式到服务器处理格式transformed后通常可用。例如JSON到Java对象。

因此,一旦完成整个Controller链接,就应在filter图层上执行或触发验证。

稍后抛出的任何验证异常都可以在以下处理程序中处理,

@RestControllerAdvice
public class RestApiExceptionController {

    @ExceptionHandler(ValidationErrorException.class)
    public ResponseEntity<?> appNotFoundException(ValidationErrorException exception) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(new ErrorResponse(exception.getErrorCode(), exception.getMessage())); 
    }
}

one的目的filters非常多,

  

在客户端访问资源之前拦截来自客户端的请求   后端。

因此,实际过滤器尚未确认实际资源。一旦控件达到纠正component,它们就可用,在您的情况下,它是Controller

因此,更好的方法是不在resource组件进行任何基于filter的验证。