繁体   English   中英

Spring过滤器抛出自定义异常

[英]Spring filter throws custom exception

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

@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,或者还有其他更好的方法来处理此类任务。

该验证是在它们是一般可以在请求的对象通常做Controller层它们之后transformed从请求格式到服务器处理的格式。 例如JSON到Java对象。

因此,一旦通过完成整个filter链接到达请求,就应该在Controller层上执行或触发验证。

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

@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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM