FreeMarker模板${error}空引用异常排查求助(已在ModelMap赋值)
排查与修复FreeMarker InvalidReferenceException(${error}变量缺失)
核心排查步骤
确认变量存入的有效性
- 在控制器返回视图前,打印
ModelMap内容:System.out.println(modelMap.get("error")),验证是否存入了非null的String值。如果输出null,说明ErrorUtils处理逻辑有问题,比如生成时返回了null,需检查ErrorUtils代码。 - 核对存入变量的键名是否严格为
"error",FreeMarker变量名区分大小写,"Error"/"ERROR"都会导致匹配失败。 - 如果是重定向场景,
ModelMap中的参数会丢失,必须改用RedirectAttributes.addFlashAttribute("error", errorContent)存入。
- 在控制器返回视图前,打印
检查模板上下文与配置
- 临时开启FreeMarker的
classic_compatible模式:在Spring配置中添加configuration.setClassicCompatible(true),若开启后不再抛异常,说明变量确实为null,回到存入环节排查空值来源。 - 检查模板是否存在局部上下文覆盖,比如
<#assign error="xxx">或嵌套的宏/包含模板修改了error变量,导致全局Model中的变量被覆盖。 - 确认视图解析器的前缀后缀配置正确,控制器返回的视图确实对应
freemarker/api-error.ftl,避免渲染了错误的模板文件。
- 临时开启FreeMarker的
排查Spring全局处理逻辑
- 检查是否有全局异常处理器、拦截器或过滤器,在视图渲染前修改/清空了
ModelMap,比如某些异常处理器会自动添加error变量,覆盖了你存入的值。
- 检查是否有全局异常处理器、拦截器或过滤器,在视图渲染前修改/清空了
快速修复方案
- 若确认变量可能为null,在模板中使用FreeMarker默认值运算符避免异常:将
${error}改为${error!""}(空字符串作为默认值),或${error!"未知错误"}。 - 修正
ErrorUtils逻辑,确保返回非null的String值,比如当原错误信息为null时,返回默认提示文本。 - 若为重定向场景,替换
ModelMap存入逻辑为RedirectAttributes.addFlashAttribute。
内容的提问来源于stack exchange,提问作者ReMadWeb
相关产品推荐
相关产品推荐

