在我的 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";
}
}