You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:24:06