SpringBoot使用SweetAlert2展示消息时访问success路径报500错误如何解决
问题根本原因
你遇到的报错核心原因有两点:
- Spring MVC中
redirect:开头的重定向属于客户端跳转,Model里存储的属性仅在当前请求生命周期有效,不会随重定向传递到下一个GET请求。你在saveProject接口中存入Model的message对象,重定向到/success的GET请求时已经丢失。 - 初始版本的
/success对应控制器方法没有往Model中存入message对象,同时success.html模板中没有做空值判断,Thymeleaf渲染时读取${message.icon}时message为null,就抛出了EL1007E: Property or field 'icon' cannot be found on null的错误。你给success接口加固定的message赋值只是临时解决了报错,但灵活性很差,如果后续需要返回不同的提示内容(比如保存失败的提示)就无法适配。
更优解决方案
推荐使用Spring提供的RedirectAttributes传递重定向参数,搭配模板空值校验,既解决参数传递问题,也能兼容直接访问页面的场景:
步骤1:修改Post接口参数,使用Flash属性传递消息
Flash属性会临时存储在Session中,重定向后自动清除,不会残留冗余数据:
@PostMapping("/saveproject") public String saveProject(RedirectAttributes redirectAttributes, @ModelAttribute project project) { System.out.println("Project detail coming from view is : "+project); // 用addFlashAttribute存储重定向传递的参数 redirectAttributes.addFlashAttribute("message", new helper("success", "Successfully save project.")); return "redirect:/success"; }
步骤2:给模板加空值校验,避免直接访问报错
使用Thymeleaf的安全导航运算符?.判断对象是否为空,同时给JS设置默认值,避免无消息时前端报错:
<script type="text/javascript"> // 安全取值,message为null时返回空字符串 var icon = "[[${message?.icon}]]" || 'info'; var title = "[[${message?.title}]]" || '操作完成'; // 仅当有有效消息时才弹出提示 if("[[${message}]]" != "null"){ Swal.fire({ position: 'top', icon: icon, title: title, showConfirmButton: false, timer: 1500 }) } </script>
这个方案的优势:
- 不需要修改
/success的GET接口逻辑,支持传递不同类型的提示(比如操作失败的error类型提示) - 避免用户刷新成功页面重复提交表单的问题
- 兼容用户直接访问
/success路径的场景,不会抛出500错误
内容的提问来源于stack exchange,提问作者Mr Anonymous
相关产品推荐
相关产品推荐

