我有一个控制器建议,可以处理我的应用程序抛出的所有验证异常,如下所示。
@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,或者还有其他更好的方法来处理这样的任务。
答案 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
的验证。