[英]Spring MVC: how to intercept 404 before returning error page/response?
在我的 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
还有什么建议吗?
我终于在这个问题中找到了解决方案(或其中的一部分):没有 @EnableWebMvc,NoHandlerFoundException 的自定义异常处理程序不起作用
默认情况下,Spring 不会为 404 错误抛出异常。 您需要在application.properties
(或 yaml)中启用此属性:
spring.mvc.throw-exception-if-no-handler-found=true
但您还需要设置此属性:
spring.mvc.static-path-pattern: /static
此限制阻止 Spring 搜索与缺少的路径/处理程序匹配的静态内容。
现在,您可以拦截NoHandlerFoundException
像往常一样@ExceptionHandler
。
注意在设置spring.mvc.static-path-pattern
属性之前,我尝试将@EnableWebMvc
添加到我的项目中的配置类:这样抛出NoHandlerFoundException
但我显然丢失了所有 Spring Boot 自动配置。
使用NoHandlerFoundException
。 这映射到 Spring Boot 中的 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";
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.