通常,我们通过@ControllerAdvice和@ExceptionHandler来捕获并处理Controller层面的异常。但是,filter是在controller层之前的,需要先通过filter才能到达controller层,此文就介绍一下如何捕获filter层面的异常。
spring的异常会转发到BasicErrorController中进行异常写入,然后才会返回客户端。所以,我们可以在BasicErrorController对filter异常进行捕获并处理。
所以,我们需要重写BasicErrorController中的error方法。
@RestController
public class ErrorController extends BasicErrorController {
public ErrorController(ServerProperties serverProperties) {
super(new DefaultErrorAttributes(), serverProperties.getError());
}
@Override
@RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity error(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
//可以通过断点调试来查看body中的信息
HttpStatus status = getStatus(request);
ResultModel result = new ResultModel();
result.setStatus(status.value());
return new ResponseEntity<>(result,status);
}
}
此处,resultModel是我自定义的一个通用返回器,如果用ResponseEntity直接返回也是可以的。自定义通用返回器可以配合SpringMVC的配置来更正确地实现。