为什么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
相关产品推荐
相关产品推荐

