Spring MVC错误处理示例

这篇文章描述了在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL 学习之路(1)创建用户,表空间,表,数据

1.用SYS用户登录PL/SQL SYSXE as SYSDBA 2.创建表空间 create tablespace Mars datafile F:\oracle\Mars.dbf size 500M autoextend on next 100M maxsize unlimited logging extent management local autoallocate segment space management auto; 3.创建用户 create user Mar…

php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

PHP7和PHP5上的安全区别preg_replace()不再支持/e修饰符利用\e修饰符执行代码的后门大家也用了不少了&#xff0c;具体看官方的这段描述:如果设置了这个被弃用的修饰符&#xff0c; preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估…

如何关闭苹果手机自动扣费_教你关闭苹果手机系统的自动更新功能,旧手机还能再用几年!...

大家都知道&#xff0c;苹果手机在更新几个大版本后&#xff0c;手机不是变得非常卡&#xff0c;就是非常的耗电&#xff0c;大大的缩短了手机的使用寿命。所以&#xff0c;许多人都不会选择更新系统&#xff0c;但是手机只要连上WiFi并且在充电状态&#xff0c;就会在半夜自动…

meta标签的常见用法

一、定义和用法 <meta> 标签始终位于 head 元素中。<meta> 元素可提供有关页面的元信息&#xff08;meta-information&#xff09;&#xff0c;元数据不会显示在页面上&#xff0c;但是对于机器是可读的。比如针对搜索引擎和更新频度的描述和关键词。 元数据&…

HttpClient的使用

新引入Hutool-HttpUtil的使用&#xff08;更简单&#xff0c;更强大&#xff01;&#xff09;&#xff0c;详见&#xff1a;http://www.cnblogs.com/jiangbei/p/7667858.html 一、概述 1.简介 根据凡技术必登其官网的原则&#xff08;如果有&#xff09;&#xff0c;我们可以先…

四人帮–代理设计模式

代理是另一种结构设计模式 &#xff0c;可以“代表”另一个对象或“代替”另一个对象以访问后面的对象。 何时使用此模式&#xff1f; 当我们需要创建一个包装来覆盖客户端的主要对象的复杂性时&#xff0c;将使用代理模式。 有哪些使用场景&#xff1f; 虚拟代理–设想一种…

面试题38_数字在排序数组中出现的次数

题目描写叙述 统计一个数字在排序数组中出现的次数。解题思路 数组是排序的&#xff0c;所以反复出现的数字是相邻排列的。 用二分查找算法&#xff0c;找到第一次出现的位置。和 最后一次出现的位置。 推断第一次出现的位置条件为&#xff1a;当前数字的前一个是否与之相等。若…

Hex hsl 转换 php,关于 RGB,HEX,HSL 颜色相互转换

最近一段时间在折腾一个微信在线编辑器的项目&#xff0c;使用 UEditor 进行二次开发。关于 UEditor 的定制&#xff0c;用到的都太粗浅&#xff0c;官方文档上都能找得到。主题使用的样式表是 ueditor.css 而不是ueditor.min.css&#xff0c;定制主题要注意这一点。而对整个项…

使用inetaddress测试目标可达性_PDPS软件机器人虚拟仿真:Smart Place功能介绍与使用方法...

概述对于机器人工作站或生产线的虚拟仿真&#xff0c;很大一部分的作用是找出机器人与工装夹具等外围设备的最佳布局位置。市面上大多数的工业机器人虚拟仿真软件都有这种专门用于检测机器人与外围设备之间最佳布局位置的功能&#xff0c;比如DELMIA软件中的“Auto Place”功能…

JAVA基础3——常见关键字解读(1)

常见的JAVA中的关键字 static static静态变量 静态变量&#xff1a;使用static关键字定义的变量。static可以修饰变量和方法&#xff0c;也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说&#xff0c;它不依赖类特定的实例&#xff0c;被…

PostgreSQL PL / java简介

现代数据库允许以多种语言编写存储过程。 一种常见的实现语言是java.NB&#xff0c;本文讨论了PostgreSQL特定的Java实现。 其他数据库的详细信息会有所不同&#xff0c;但是概念是相同的。 PL / Java的安装 在Ubuntu系统上安装PL / Java很简单。 我将首先创建一个新模板templ…

强连通分量 圆桌骑士

题目描述 圆桌骑士是一个非常吸引人的职业。因此&#xff0c;在最近几年里&#xff0c;亚瑟王史无前例的扩招圆桌骑士&#xff0c;并不令人惊讶。现在这里有许多圆桌骑士&#xff0c;每个圆桌骑士都收到一份珍贵的邀请函&#xff0c;被邀请去英灵殿圆桌。这些骑士将要环绕着坐在…

微信小程序echarts层级太高

项目中因为需求&#xff0c;底部的tab导航栏是自己写的&#xff0c;在开发者工具中一切正常&#xff1b;但是在真机上页面滑动时&#xff0c;echarts的层级比tab高&#xff0c;调过两者的z-index后仍然如此。 经过查找后发现cover-view和cover-image替换tab的view后&#xff0…

php解密 码表,php拼音码表的生成

php拼音码表的生成发布于 2014-09-07 11:12:52 | 90 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点&#xff0c;入门门槛…

angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景

转载自&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。原文出处&#xff1a;https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02随着信息技术领域的发展&#xff0c;企业…

工厂设计模式案例研究

我有一份工作来检查我们的项目代码质量。 如果我在项目中发现任何障碍&#xff0c;必须将其报告给我的团队负责人。 我发现了很多漏洞&#xff0c;我认为可以在博客上进行讨论。 不是嘲笑作者&#xff0c;而是一起学习和改进自己。 像这段代码一样&#xff0c;这是我在我们的代…

【javascript】DOM操作方法(3)——document节点属性

document.doctype //document.documentElement //来获取html元素 document.defaultView //返回document对象所在的window对象 document.body //返回当前文档的<body>节点 document.head //返回当前文档的<head>节点 document.activeElement //返回当前文…

debian dhcp服务启动不了_DHCP服务器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于动态配置工作站网络接口&#xff0c;使工作站的网络接口管理自动化。DHCP服务器软件dhcpd网站&#xff1a;http://www.isc.org安装方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

泽西岛的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我讨论了一个允许在WADL中使用JSON-Schema的建议&#xff0c;这篇文章探讨了如何使它与最近构建的Jersey一起使用。 在1.16发布之前&#xff0c;您将必须下载/参考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假设您已经有…

C++map类型 之 简单介绍

一&#xff1a;map的前世今生&#xff08;1&#xff09;从关联容器与顺序容器说起。关联容器通过键&#xff08;key&#xff09;存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素&#xff08;vector,queue,stack,list等&#xff09;。关联容器&#xff0…