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

为什么Model.addObject添加的属性未在Thymeleaf错误页正常渲染?

问题原因及解决方案

1. 视图名与Spring Boot默认错误路径冲突(最高概率)

Spring Boot内置的BasicErrorController默认会处理/error路径,当你在异常处理器中返回视图名为error时,请求会被转发到默认错误控制器处理,你存入ModelAndView的属性会在转发过程中丢失,导致模板无法获取对应值。

2. 异常类型匹配/方法调用错误

Spring原生的org.springframework.validation.BindException没有getErrCode()方法,如果你要捕获的是自定义的BindException:
你当前的@ExceptionHandler未明确指定异常类型,入参写的是通用Exception,可能实际捕获到的是Spring原生BindException,调用getErrCode()会抛出NoSuchMethodException,导致你的异常处理器执行中断,最终走默认错误处理逻辑,你设置的Model属性自然不会生效。

3. ControllerAdvice未被Spring正确扫描

如果你的globalControllerAdvice类不在Spring Boot启动类的同级包或子包下,没有被自动扫描注册为Bean,该异常处理器不会生效,异常会走默认处理流程,不会携带你自定义的属性。


修复步骤

  • 优先修改视图名避开默认冲突:将error.html改名为bind_error.html,同时异常处理器中修改为model.setViewName("bind_error");,测试属性是否正常填充。
  • 明确指定异常处理类型:如果使用自定义BindException,调整代码如下:
@ControllerAdvice
public class GlobalControllerAdvice {
    // 明确指定处理的自定义异常类型
    @ExceptionHandler(com.yourpackage.YourCustomBindException.class)
    public ModelAndView handleMyException(HttpServletRequest req, com.yourpackage.YourCustomBindException e) {
        ModelAndView model = new ModelAndView();
        model.addObject("myerror",e.getErrCode());
        model.addObject("message",e.getMessage());
        model.addObject("exception","bind exception");
        model.setViewName("bind_error");
        return model;
    }
}

如果要处理Spring原生BindException,修改错误码获取逻辑:

model.addObject("myerror", e.getBindingResult().getAllErrors().get(0).getCode());
  • 确认异常处理器类被扫描:如果类不在启动类扫描范围内,在启动类上添加@ComponentScan(basePackages = "com.yourpackage.advice")指定扫描路径。

内容的提问来源于stack exchange,提问作者Alpharius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:09:03