如何在 Spring MVC 中管理错误消息

Posted

技术标签:

【中文标题】如何在 Spring MVC 中管理错误消息【英文标题】:How to manage error message in Spring MVC 【发布时间】:2014-02-05 03:04:18 【问题描述】:

我是 Spring MVC 的新手。我的 abc 页面只有一个提交按钮。单击提交按钮时,将调用位于 xyzController 内的 abcHandler。 只是想知道如何实现这种情况。

-- 如果发生错误,它应该返回一些消息。 -- 它应该留在同一页,对我来说是它的 abc 页。

我已经尝试过了。我面临的问题是,我收到警报消息“你必须有东西......”, 但它正在导航到错误页面意味着一个空白页面。这不应该发生。我想显示消息并留在同一页面上。 如何使用 Spring MVC 轻松实现。 请提出一些想法。

public class xyzController extends MultiActionController implements InitializingBean 

public ModelAndView abcHandler(HttpServletRequest request,HttpServletResponse response)throws Exception  

// session
HttpSession session = request.getSession(true);

String abc = "";
if(abc != "")

else
String error = "You must have xyzzzzzz";
return new ModelAndView("2.0/error", "downloaderror", error);


return new ModelAndView();


我的error.jsp是这样的

<!DOCTYPE html>
<html>
<head>
<script src="abc/js/jquery-1.9.0.min.js"></script>
</head>
<body>
<c:if test="$not empty downloaderror">
<script>
    alert("You must have something...");        
</script>
</c:if>
</body>
</html>

【问题讨论】:

您的abc != "" 比较将始终解析为true。将其更改为"".equals(abc)abc.isEmpty() 你知道它不能是null 你说你正在提交一些东西。如果您使用的是表单,则应使用BindingResult 进行验证并通过&lt;form:errors path="property" /&gt; 显示错误 【参考方案1】:

验证失败时不要返回错误页面,而是返回同一页面,因此您在 else 块中的代码应该是

else String error = "You must have xyzzzzzz";
        return new ModelAndView("2.0/error", "downloaderror", abc); 

并且还将错误消息存储在模型映射中,针对“errormsg”之类的键,并在您的 abc 页面上检查该键,然后打印消息。

【讨论】:

【参考方案2】:

像这样在控制器方法中添加错误标志

public ModelAndView abcHandler(HttpServletRequest request, HttpServletResponse response)throws Exception  

 ModelAndView model=new ModelAndView();
 model.addObject("error", true);

 return model;


在 JSP 中

<!DOCTYPE html>
<html>
<head>
<script src="abc/js/jquery-1.9.0.min.js"></script>
</head>
<body>
<c:if test="$error">
<script>
  alert("You must have something...");        
</script>
</c:if>
</body>
</html>

【讨论】:

ModelAndView 类型的方法 addAttribute(String, boolean) 未定义。为什么会这样?我使用的是旧版本的 Spring 框架还是什么? 使用addObject方法添加属性参数。 我试过了,我现在收到这个错误:ModelAndView [ModelAndView: materialized View is [null]; model is error=true] servlet 中既不包含视图名称也不包含名称为“XXXXX”的视图对象 您收到此错误是因为您没有设置视图。像这样 model.setView("home"); 为模型对象设置视图。现在这个控制器将搜索 home.jsp 如果存在,否则它会抛出一个异常。 是的,我已经尝试过了,它可以按您的预期工作,但是,我的按钮在表单内,并且表单正在执行调用此 abc 处理程序的操作,并且 url 不同,所以它将空白页。【参考方案3】:

您可以自行实现HandlerExceptionResolver。参考本教程:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

【讨论】:

我试过了,我现在收到这个错误:ModelAndView [ModelAndView: materialized View is [null]; model is error=true] servlet 中既不包含视图名称也不包含名称为“XXXXX”的视图对象【参考方案4】:

您可以通过以下方式实现该场景:

import org.springframework.web.servlet.ModelAndView; 

public ModelAndView abcHandler(HttpServletRequest request, HttpServletResponse response)throws Exception  

 ModelAndView model=new ModelAndView();
 model.addObject("ERROR_CODE", "Error Occurred");
 model.setViewName("page1");

 return model;


你的jsp页面如下:

page1.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>

    <body>
    <c:if test="$!empty ERROR_CODE ">
   <c:out value="$ERROR_CODE "></c:out>
    </c:if>
    </body>
    </html>

【讨论】:

是的,我也尝试过,但它会转到 page1.jsp,这不应该发生。我的要求是,它应该保持在它所在的同一页面中。 我的按钮在表单内,并且表单正在执行调用此 abc 处理程序的操作,并且该 url 不同,因此它将转到空白页面 在视图名称中,您可以提供具有按钮的页面的名称...并且您可以将 逻辑放在同一页面上。

以上是关于如何在 Spring MVC 中管理错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC for Rest 服务如何在 Jackson 反序列化错误时自定义错误“消息”?

如何在spring mvc中使用带有freemarker的消息?

如何在没有 if else 的情况下处理 Spring-MVC 项目中的错误?

如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?

我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)

Spring MVC权限管理如何设置?