Spring Boot使用@ControllerAdvice处理异常后无法跳转视图怎么解决
问题根因梳理
- 触发异常的请求为异步请求:如果前端发起的是AJAX/Fetch等异步请求,后端返回的ModelAndView视图不会触发浏览器自动跳转,需要前端配合处理响应
- 异常处理器类存在多余继承:
GlobalExceptionHandler标注了@ControllerAdvice无需继承RuntimeException,多余继承可能引发未知适配问题 - 未指定重定向前缀:默认返回的视图名是请求转发,若需强制跳转要加
redirect:前缀 - 视图配置不匹配:
vixe对应的模板文件不存在、路径错误,或者未引入对应的模板引擎依赖
修复步骤
1. 修正全局异常处理器代码
@ControllerAdvice public class GlobalExceptionHandler { private Logger logger = Logger.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception{ logger.info("Tratando erro de exception."); logger.error("ERRO: " + e); ModelAndView mav = new ModelAndView(); // 加redirect前缀表示重定向,不加为请求转发 mav.setViewName("redirect:/vixe"); return mav; } }
2. 配置视图映射(未配置路径映射时需要)
新增Web配置类,将/vixe路径映射到对应视图:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/vixe").setViewName("vixe"); } }
3. 异步请求适配(如果是AJAX触发的异常)
如果异常是异步请求触发,需要修改异常处理器,异步请求返回跳转标识,前端主动跳转:
后端适配代码
@ExceptionHandler(value = Exception.class) public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception{ logger.info("Tratando erro de exception."); logger.error("ERRO: " + e); // 判断是否为AJAX请求 String requestType = req.getHeader("X-Requested-With"); if ("XMLHttpRequest".equals(requestType)) { Map<String, Object> res = new HashMap<>(); res.put("code", 500); res.put("redirect", "/vixe"); return res; } // 同步请求直接重定向 return new ModelAndView("redirect:/vixe"); }
前端适配代码(以jQuery为例)
$.ajax({ url: '你的请求地址', type: 'POST', success: function (res) { // 收到500状态主动跳转 if (res.code === 500 && res.redirect) { window.location.href = res.redirect; } // 其他业务逻辑 } })
4. 校验视图配置
- 确认已引入模板引擎依赖,以Thymeleaf为例,Maven配置如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 确认
vixe.html模板文件放在src/main/resources/templates目录下,没有拼写错误
内容的提问来源于stack exchange,提问作者Cleverton Inácio
相关产品推荐
相关产品推荐

