Spring MVC:如何在返回错误页面/响应之前拦截 404?



在我的 Spring Boot 2.2.x Web 应用程序中,我需要拦截 404 错误,以便我可以在呈现错误页面或返回带有错误信息的 json 之前执行一些自定义逻辑。

实现这一目标的正确方法是什么?

目前我正在尝试使用@ControllerAdvice类,但我不知道使用@ExceptionHandler方法处理哪个异常(如果有抛出的话(......

注意:我已经尝试拦截NoHandlerFoundException,但这似乎不起作用...(不触发处理程序(。

@ControllerAdvice
public class ErrorHandler {
@ExceptionHandler(NoHandlerFoundException.class)
public void handleException() {
System.out.println("It's a 404!");
}
}

我也在我的application.properties中启用了它:

spring.mvc.throw-exception-if-no-handler-found=true

还有其他建议吗?

我终于在这个问题中找到了解决方案(或部分解决方案(:NoHandlerFoundException的自定义异常处理程序在没有@EnableWebMvc的情况下无法正常工作

默认情况下,Spring 不会为 404 错误抛出异常。您需要在application.properties(或 yaml(中启用此属性:

spring.mvc.throw-exception-if-no-handler-found=true

但您还需要设置此属性:

spring.mvc.static-path-pattern: /static

此限制阻止 Spring 搜索与缺少的路径/处理程序匹配的静态内容。

现在,您可以像往常一样使用@ExceptionHandler拦截NoHandlerFoundException

注意在设置spring.mvc.static-path-pattern属性之前,我尝试将@EnableWebMvc添加到项目中的配置类中:这样抛出了NoHandlerFoundException,但我显然丢失了所有 Spring Boot 自动配置。

使用NoHandlerFoundException.这映射到春季启动中的 404。

在同一个类中,你使用@ControllerAdvice实现ErrorController

@ControllerAdvice
public class ControllerAdvice implements ErrorController {
@RequestMapping("/error")
public ResponseEntity<Map> handleError(HttpServletResponse response) {
Map errorMapJson = new HashMap();
if(response.getStatus() == HttpStatus.NOT_FOUND.value()) {
errorMapJson.put("type", "404 Error");
}
return new ResponseEntity<Map>(errorMapJson, HttpStatus.NOT_FOUND);
}
@Override
public String getErrorPath() {
return "/error";
}
}

最新更新