这篇文章描述了在Spring MVC 3中执行错误处理的不同技术。该代码在GitHub上的Spring-MVC-Error-Handling目录中可用。 它基于带有注释的Spring MVC示例。

在Spring 3之前处理异常

在Spring 3之前,使用HandlerExceptionResolvers处理异常。 此接口定义一个方法:

ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex)

注意,它返回一个ModelAndView对象。 因此,遇到错误意味着将被转发到特殊页面。 但是,此方法不适用于REST Ajax对JSON的调用(例如)。 在这种情况下,我们不想返回页面,我们可能想返回特定的HTTP状态代码。 提供了进一步描述的解决方案。

为了本示例的缘故,已经创建了两个假的CustomizedException1和CustomizedException2异常。 要将自定义的异常映射到视图,可以(并且仍然可以)使用impleMappingExceptionResolver :

SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {SimpleMappingExceptionResolver result= new SimpleMappingExceptionResolver();// Setting customized exception mappingsProperties p = new Properties();p.put(CustomizedException1.class.getName(), 'Errors/Exception1');result.setExceptionMappings(p);// Unmapped exceptions will be directed thereresult.setDefaultErrorView('Errors/Default');// Setting a default HTTP status coderesult.setDefaultStatusCode(HttpStatus.BAD_REQUEST.value());return result;}

我们将CustomizedException1映射到Errors / Exception1 JSP页面(视图)。 我们还为未映射的异常设置了默认错误视图,在此示例中为CustomizedException2。 我们还设置了默认的HTTP状态代码。

这是Exception1 JSP页面,默认页面与此类似:

<%@page contentType='text/html' pageEncoding='UTF-8'%>
<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
<!doctype html>
<html lang='en'>
<head><meta http-equiv='Content-Type' content='text/html;' charset=UTF-8'><title>Welcome To Exception I !!!</title>
</head>
<body><h1>Welcome To Exception I !!!</h1>Exception special message:<${exception.specialMsg}<a href='<c:url value='/'/>'>Home</a>
</body>
</html>

我们还创建了一个虚拟错误控制器来帮助触发这些异常:

@Controller
public class TriggeringErrorsController {@RequestMapping(value = '/throwCustomizedException1')public ModelAndView throwCustomizedException1(HttpServletRequest request,HttpServletResponse response)throws CustomizedException1 {throw new CustomizedException1('Houston, we have a problem!');}@RequestMapping(value = '/throwCustomizedException2')public ModelAndView throwCustomizedException2(HttpServletRequest request,HttpServletResponse response)throws CustomizedException2 {throw new CustomizedException2('Something happened on the way to heaven!');}...}

在Spring 3之前,将在Web.xml中将SimpleMappingExceptionResolver声明为@Bean。 但是,我们将使用HandlerExceptionResolverComposite,稍后将对其进行描述。

我们还在web.xml中为HTTP状态代码配置目标页面,这是处理问题的另一种方法:

<error-page><error-code>404</error-code><location>/WEB-INF/pages/Errors/My404.jsp</location>
</error-page>

从Spring 3.X开始有什么新功能?

@ResponseStatus批注是在调用方法时设置Http状态代码的新方法。 这些由ResponseStatusExceptionResolver处理。 @ExceptionHandler注释有助于在Spring中处理异常。 此类注释由AnnotationMethodHandlerExceptionResolver处理。

下面说明了如何在触发我们的自定义异常时使用这些注释将HTTP状态代码设置为响应。 该消息在响应的正文中返回:

@Controller
public class TriggeringErrorsController {...@ExceptionHandler(Customized4ExceptionHandler.class)@ResponseStatus(value=HttpStatus.BAD_REQUEST)@ResponseBodypublic String handleCustomized4Exception(Customized4ExceptionHandler ex) {return ex.getSpecialMsg();}@RequestMapping(value = '/throwCustomized4ExceptionHandler')public ModelAndView throwCustomized4ExceptionHandler(HttpServletRequest request,HttpServletResponse response)throws Customized4ExceptionHandler {throw new Customized4ExceptionHandler('S.O.S !!!!');}}

在用户端,如果使用Ajax调用,则可以使用以下方法(我们正在使用JQuery)来检索错误:

$.ajax({type: 'GET',url:  prefix + '/throwCustomized4ExceptionHandler',async: true,success: function(result) {alert('Unexpected success !!!');},error: function(jqXHR, textStatus, errorThrown) {alert(jqXHR.status + ' ' + jqXHR.responseText);}
});

一些使用Ajax的人喜欢返回带有错误代码的JSON和一些用于处理异常的消息。 我觉得这太过分了。 一个简单的错误号和一条消息使其保持简单。

由于我们使用了多个解析器,因此我们需要一个复合解析器(如前所述):

@Configuration
public class ErrorHandling {...@BeanHandlerExceptionResolverComposite getHandlerExceptionResolverComposite() {HandlerExceptionResolverComposite result= new HandlerExceptionResolverComposite();List<HandlerExceptionResolver> l= new ArrayList<HandlerExceptionResolver>();l.add(new AnnotationMethodHandlerExceptionResolver());l.add(new ResponseStatusExceptionResolver());l.add(getSimpleMappingExceptionResolver());l.add(new DefaultHandlerExceptionResolver());result.setExceptionResolvers(l);return result;}

DefaultHandlerExceptionResolver解析标准的Spring异常并将其转换为相应的HTTP状态代码。

运行示例

编译后,可以使用mvn tomcat:run运行该示例。 然后,浏览:

http:// localhost:8585 / spring-mvc-error-handling /

主页将如下所示:

如果单击“例外1”链接,将显示以下页面:

如果单击“例外2”链接,将显示以下页面:

如果单击“异常处理程序”按钮,将显示一个弹出窗口:

这些技术足以涵盖Spring中的错误处理。

更多春天相关的帖子在这里 。

参考: 技术说明博客上来自JCG合作伙伴 Jerome Versrynge的Spring MVC错误处理 。

翻译自: https://www.javacodegeeks.com/2012/11/spring-mvc-error-handling-example.html

Spring MVC错误处理示例相关推荐

  1. Spring MVC @RequestMapping Annotation示例

    Spring MVC @RequestMapping Annotation示例 Controller,Methods,Headers,Params,@ RequestParam,@ PathVaria ...

  2. Spring MVC错误处理流程

    使用Spring MVC可以通过三种方式处理异常流,其目的是拦截任何应用程序异常,并向用户提供友好而信息丰富的视图. 1.在web.xml文件中使用error-page标记: 这是servlet规范驱 ...

  3. Spring MVC拦截器示例

    我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring ...

  4. Spring MVC - Hello World示例

    以下示例演示如何使用Spring MVC框架编写一个简单的基于Web的Hello World应用程序.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发一个 ...

  5. 关于spring MVC机制,示例解读

    2019独角兽企业重金招聘Python工程师标准>>> spring MVC分离了控制器.模型对象.工作过程如下: 1.Spring mvc请所有的请求都提交给DispatcherS ...

  6. 带有控制器,方法,标题,参数,@ RequestParam,@ PathVariable的Spring MVC @RequestMapping注释示例

    @RequestMapping is one of the most widely used Spring MVC annotation. org.springframework.web.bind.a ...

  7. Google App Engine + JDO + Spring MVC,CRUD示例

    注意 本教程更多关于实践指南,请参考此官方的在数据存储区中使用JDO了解详细说明. 请参阅以下代码段,以使用Java数据对象(JDO)在GAE数据存储上执行CRUD. 只需使用JDO注释为客户注释,然 ...

  8. spring mvc错误收集

    The request sent by the client was syntactically incorrect (). 错误原因在于蓝色字体和红色字体不同,注意. @RequestMapping ...

  9. Spring MVC 错误

    @requestMapping(value={"list",""}) 报 invalid property....错误 解决改为:@requestMapping ...

最新文章

  1. C++语言引用的介绍和示例
  2. 专科python应届生工资多少-大四应届毕业生,学了两个月Python,找工作感觉好难啊?...
  3. 深度学习(01)——安装anaconda
  4. 对空进行判断需要注意什么?
  5. java pdf绘图_Java 在PDF文档中绘制图形
  6. mac电脑ip地址修改教程
  7. IEC 60601-2-33:2022 《医疗诊断用磁共振设备基本安全和基本性能的特殊要求》。
  8. Excel零基础入门(真对2021版Excel)
  9. MOOC_Python语言程序设计_习题_《沉默的羔羊》文本分析
  10. 三星+android+u盘模式,三星安卓机,如何开启开发者模式,进行USB调试?
  11. java使字符串转二维码
  12. MySQL优化之hints
  13. 4.0寸86盒显示屏调试(一)
  14. 耳麦不能讲话怎么办?
  15. Matlab一个错误引发的血案:??? Error using == str2num Requires string or character array input....
  16. 路由器与交换机配置测试题及答案
  17. 算法图解——广度优先搜索
  18. 网吧Windows XP母盘制作详解(转)
  19. TensorFlow2.0基础学习笔记
  20. nacos 单机部署_使用Docker部署Nacos-Server(单机版)

热门文章

  1. 登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)
  2. ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
  3. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理
  4. 世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界
  5. oracle jdk_两个Oracle JDK的故事
  6. java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举
  7. java8返回单个号码_如何在单个API中支持Java 6、8、9
  8. Spring @Value批注
  9. servlet 异常处理_Servlet异常和错误处理示例教程
  10. 构建Spring Boot RESTful服务+ Spring Boot执行器