SpringBoot自定义/error路径失效
背景 最近使用SpringBoot做controller统一异常处理的时候,配置好映射路径(/error),使用SpringBoot自带的异常通知注解@ControllerAdvice
配置好异常处理类,按理说在Controller发生异常的时候重定向到自定义错误页面(这里是重定向到SpringMVC的映射路径),可实际调试的时候却定向到了SpringBoot默认的错误页面。
【SpringBoot自定义/error路径失效】
文章图片
配置信息 此处配置只是一个小示例,省略了对异常的处理。
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {@ExceptionHandler({Exception.class})
// 此方法参数有多个,具体可参考相关文档
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendRedirect(request.getContextPath() + "/error");
}
}
@Controller
public class HomeController {
@GetMapping("/error")
public String getErrorPage(){
// 此处使用了Thymeleaf模板,返回的是页面
return "/site/error/500";
}
}
解决思路 由于我在controller中配置了
/error
的映射路径,我通过网页路径直接访问该路径也是上面那个错误页面,断点调试也没有进入我自定义的controller。再看页面显示的状态码,不是404,说明该路径是没有问题的。这个问题困惑了我很久,一开始没转过弯来。说下我的解决思路,因为我在使用的SpringBoot配置文件是application.yml
,这个文件在idea中会有提示,我在该配置文件中输入了error,如下图:文章图片
这里有一个
server.error.path=/error
,看到这个就大概知道原因了,路径冲突了,我在SpringMVC中配置的映射路径也是error
。尝试验证一下,将SpringMVC的路径修改了一下,果然可以正常访问了。有没有可以不改变SpringMVC路径的方法呢?我一开始是在application.yml
中加入下面这段配置:server:
error:
# 此处可随便写一个路径,或者留空也行,只有不和自定义的error路径冲突
path:
这样确实可以解决路径冲突的问题,可是这只是去忽略它,而不是去修改它。通过查阅资料发现,SpringBoot会为我们创建一个叫
BasicErrorController
的类,该类由Spring创建并默认用来处理Controller中的异常,如果能替换掉该类,就可以解决我们的问题。如何替换?Spring提供的方法提供一个类型实现ErrorController
接口,其实BasicErrorController
也是实现了该类。所有我们只需要将我们自定义ExceptionAdvice
类实现该接口,实现相应方法即可,修改后代码如下:@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice implements ErrorController{private static final String ERROR_PATH = "/error";
@ExceptionHandler({Exception.class})
// 此方法参数有多个,具体可参考相关文档
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendRedirect(request.getContextPath() + "/error");
}@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
总结 其实就是一个很简单的问题,而我在一开始的时候却在纠结是不是注解使用错误之类的事,debug方向是对的,就是一时间没转过弯来,导致这个问题困扰了我挺长的时间,好在及时理清思路后能解决该问题。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 解决SpringBoot引用别的模块无法注入的问题
- gitlab|gitlab 通过备份还原 admin/runner 500 Internal Server Error
- 列出所有自定义的function和view
- 解决SyntaxError:|解决SyntaxError: invalid syntax
- springboot使用redis缓存
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 自定义MyAdapter