Spring 3 MVC异常处理程序

我遇到的大多数Spring 3错误处理示例代码似乎都提供了其用法的最简单概述,但是,有人说,如何处理错误比正常代码的工作方式更为重要。 前一天,当我在Spring(2)错误处理程序中遇到一个简单的'GOTCHA'时,这一点得到了证实,该错误处理程序使整个网站瘫痪并几乎杀死了服务器,但稍后会更多。

今天的博客探讨了使用@ ExceptionHandler批注创建简单的Spring 3 servlet异常处理程序的场景。 尽管您可能在此之前就已经看到了它,但它为我提供了一个很好的起点。在本演示中,我创建了一个简单的Spring 3 MVC webapp( 1),其中主页( home.jsp )向不稳定的控制器类发出请求引发异常( ExceptionDemoController

/*** Whoops, throw an IOException*/@RequestMapping(value = "/ioexception", method = RequestMethod.GET)public String throwIoException(Locale locale, Model model) throws IOException {logger.info("This will throw an IOExceptiom");boolean throwException = true;if (throwException) {throw new IOException("This is my IOException");}return "home";}

上面的不稳定控制器代码是生成错误的第一步。 这个想法是应该让用户返回我们的主页,但是在处理用户请求的过程中,它抛出了一个简单的IOException 。 一旦引发,此方法将捕获异常:

/*** Catch IOException and redirect to a 'personal' page*/@ExceptionHandler(IOException.class)public ModelAndView handleIOException(IOException ex) {logger.info("handleIOException - Catching: " + ex.getClass().getSimpleName());return errorModelAndView(ex);}/*** Get the users details for the 'personal' page*/private ModelAndView errorModelAndView(Exception ex) {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("error");modelAndView.addObject("name", ex.getClass().getSimpleName());modelAndView.addObject("user", userDao.readUserName());return modelAndView;}

设置起来非常简单,您需要做的就是添加:

@ExceptionHandler(IOException.class)

…对于方法签名,等等,您已经完成了…这就是简单的工作。

这里有一些值得注意的地方:首先,使用

@ExceptionHandler(IOException.class)

…将遵守通常的例外处理合同。 这意味着上述方法不仅将捕获所有IOExceptions ,还将捕获作为IOException子类的所有异常; 因此,如果我的throwAnException (..)方法抛出FileNotFoundException,它仍然会被我的handleIOException (...)方法捕获。

其次,有一组非常灵活但最终有限的方法签名,可用于异常处理程序方法。 完整的文档由Spring的JavaDoc提供 ,但总而言之,您可以设计一个签名,该签名包含任意顺序的以下任何输入参数:

  • 异常或其子类之一
  • ServletRequest或HttpServletRequest
  • ServletResponse或HttpServletResponse
  • HttpSession
  • WebRequest或NativeWebRequest
  • 语言环境
  • InputStream或其子类之一来访问请求的内容
  • OutputStream或其子类之一来访问响应的内容
  • 读者或其子类别之一
  • 作家或其子类别之一

方法签名还必须具有以下返回类型之一:

  • 模型和视图
  • 模型
  • 地图
  • 视图
  • 字符串–解释为视图名称
  • 无效,但前提是该方法直接写入响应对象

所有这些在任何情况下都足以满足任何情况。

使用@ ExceptionHandler使您能够执行针对不同错误情况的细粒度异常处理。 在示例代码的情况下,我创建了一个新的ModelAndView对象,并用用户名填充该对象,以便亲自告诉他(她)系统丢失了他们的文档。 有人可能会说这是一个限制,因为@ExceptionHandler的粒度是如此之细,以致您只能捕获包含@ExceptionHandler注释方法的控制器抛出的异常 。 我不同意,如果您想在一个地方捕获多个控制器抛出的异常,那么该技术不适合您,您应该考虑使用SimpleMappingExceptionResolver

实施错误处理时要考虑很多因素,例如:如果错误处理程序中存在错误,会发生什么? 您应该使用粗粒度还是细粒度异常处理程序? 如何设置HTTP状态代码? 因此,接下来的几篇博客将进一步研究错误处理,演示如何将多个异常类分配给单个@ExceptionHandler以及如何将异常处理程序符号与@ResponseStatus结合起来以微调服务器的HTTP状态代码,并且可能还会更多……

参考:来自JCG合作伙伴的 Spring 3 MVC异常处理程序   调试队长博客的 Roger Hughes。


  1. 完整的Webapp示例可在以下位置获得:
    git://github.com/roghughe/captaindebug.git
  2. 请参阅Spring文档以获取参考资料。

翻译自: https://www.javacodegeeks.com/2012/02/spring-3-mvc-exception-handlers.html

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

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

相关文章

java编译找不到符号_javac编译时找不到符号?

我是个新手,在linux使用java编程时,出现这个情况。我把要引的包放在classpath中,红色部分:export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/hadoop-1.0.4.core.jar:${CLASSPATH}通过echo $CLASSP…

全备份、差异备份和增量备份概念详述

全备份、差异备份和增量备份概念详述 1、完全备份(Full Backup) 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件。在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份。换言之&#xff0…

微信接入登录功能access_token流程记录

提示:只有认证过的订阅号或者服务号才能获取access_token。 1.app微信登录第一步是,app调起来微信客户端,通过app端的配置,引入一个微信类库, 2.授权成功后,微信会返回你一个code。 将APP_ID替换成你在微信…

使用MVC模式制作游戏-教程和简介

游戏开发中一种有用的体系结构模式是MVC(模型视图控制器)模式。 它有助于分离输入逻辑,游戏逻辑和UI(渲染)。 在任何游戏开发项目的早期阶段,其实用性很快就会被注意到,因为它允许快速更改内容&…

boost

参考博客 http://www.cnblogs.com/lidabo/p/3805487.html http://www.cppblog.com/Robertxiao/archive/2013/01/06/197022.html http://www.cnblogs.com/finallyliuyu/archive/2013/05/23/3094246.html http://www.cnblogs.com/lidabo/p/3782193.html http://www.cnblogs.com/z…

moment格式换时间_不一样的日期、时间转换(moment.js)

无意中遇到了一种很奇怪的日期格式,从接口中返回的日期是这样的,如 2018-02-06T11:59:2208:00 。然而这却不是我们想要的,我们要的是这种,YYYY-MM-DD HH:mm:ss。那么这种是怎么转换的呢?这时候就可以使用一款很好用的日…

并发模式:生产者和消费者

在我15年的职业生涯中,生产者和消费者的问题是我仅遇到过几次。 在大多数编程情况下,我们正在做的事情是以同步方式执行功能,其中JVM或Web容器自行处理多线程的复杂性。 但是,在编写某些需要的用例时。 上周,我遇到了一…

POJ 1006 - Biorhythms (中国剩余定理)

B - BiorhythmsTime Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1006Description 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中…

子线程中更新UI线程的三个方法

1、通过handler方式,sendmessage。 多个类间传递比较麻烦,也懒的写... 2、线程中通过runOnUiThread() new Thread() { public void run() { //这儿是耗时操作,完成之后更新UI; runOnUiThread(new Runnab…

mysql limit acs_mysql查询操作

简单查询&#xff1a;select * from 表名;避免重复&#xff1a;select distinct 字段 from 表名;条件查询&#xff1a;select 字段,字段 from 表名 where id<5(条件);四则运算查询&#xff1a;select id,dep_id,id*dep_id from company.employee5 where id<5;定义显示格式…

作业管理系统数据字典

转载于:https://www.cnblogs.com/heyangcan/p/5312394.html

使用Hive和iReport进行大数据分析

每个JJ Abrams的电视连续剧疑犯追踪从主要人物芬奇先生一个下列叙述情节开始&#xff1a;“ 你是被监视。 政府拥有一个秘密系统-每天每天每小时都会对您进行监视的机器。 我知道是因为...我建造了它。 “当然&#xff0c;我们的技术人员知道得更多。 庞大的电气和软件工程师团…

docker集群管理

docker集群管理 ps&#xff1a;docker machine docker swarm docker compose 在Docker Machine发布之前&#xff0c;你可能会遇到以下问题&#xff1a; 你需要登录主机&#xff0c;按照主机及操作系统特有的安装以及配置步骤安装Docker&#xff0c;使其能运行Docker…

从0学java_从零开始学JAVA(一.Java的基础语法)

基本语法编写 Java 程序时&#xff0c;应注意以下几点&#xff1a;大小写敏感&#xff1a;Java 是大小写敏感的&#xff0c;这就意味着标识符 Hello 与 hello 是不同的。类名&#xff1a;对于所有的类来说&#xff0c;类名的首字母应该大写。如果类名由若干单词组成&#xff0c…

linux mount (挂载命令)详解

挂接命令(mount) 首先&#xff0c;介绍一下挂接(mount)命令的使用方法&#xff0c;mount命令参数非常多&#xff0c;这里主要讲一下今天我们要用到的。 命令格式&#xff1a;mount [-t vfstype] [-o options] device dir 其中&#xff1a; 1.-t vfstype 指定文件系统的类型&…

Android官方培训课程中文版(v0.9.5)

http://hukai.me/android-training-course-in-chinese/index.html转载于:https://www.cnblogs.com/xiaoyao095/p/6125715.html

使用SaxParser和完整代码进行XML解析

SAX解析器使用回调函数&#xff08;org.xml.sax.helpers.DefaultHandler&#xff09;通知客户端XML文档结构。 您应该扩展DefaultHandler并重写一些方法来实现xml解析。 覆盖的方法是 startDocument&#xff08;&#xff09;和endDocument&#xff08;&#xff09;–在XML文档…

mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数

一、常见字符串函数&#xff1a;1、CHAR_LENGTH 获取长度(字符为单位)2、FORMAT 格式化3、INSERT 替换的方式插入4、INSTR 获取位置5、LEFT/RIGHT 取左、取右6、LENGTH 获取长度(字节为单位)7、LTRIM/RTRIM/TRIM 去空格(左/右/自定义)8、STRCMP 字符串比较9、CONCAT 字…

Android异常和工具使用笔记

Android异常和工具使用笔记 1、r文件找不到去你的工程目录下&#xff0c;手动的把gen删掉&#xff0c;然后去project中刷新一下&#xff0c;在编译看看。以前遇到过类似的问题&#xff0c;实在不行就把你的eclispe,adt升级到最新的版本吧 抓住那么一点点线索&#xff0c;就要去…

ADO.NET 核心对象简介

ADO.NET ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库&#xff0c;提供了数据访问的高层接口。 ADO.NET类库在System.Data命名空间内&#xff0c;根据我们访问的不同数据库选择命名空间&#xff0c;System.Data.SqlClient。 ADO.NET类最重要的优点是支持数据库以断开…