我遇到的大多数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

Spring 3 MVC异常处理程序相关推荐

  1. spring mvc异常统一处理(ControllerAdvice注解)

    spring mvc异常统一处理(ControllerAdvice注解) 参考文章: (1)spring mvc异常统一处理(ControllerAdvice注解) (2)https://www.cn ...

  2. spring mvc 异常统一处理方式

    spring mvc 异常统一处理方式 参考文章: (1)spring mvc 异常统一处理方式 (2)https://www.cnblogs.com/xd502djj/archive/2012/09 ...

  3. Spring MVC异常统一处理(异常信息的国际化,日志记录)

    JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都 ...

  4. Spring 3 MVC深入研究

    前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring3 MVC结构简单,应了那句话简单就是美,而且他 ...

  5. Spring Web MVC(一)

    概述 Spring Web MVC框架的特点 五大核心组件 编程步骤 五大核心组件 DispatcherServlet前端控制器 WebApplicationContext中特殊的bean 处理过程 ...

  6. Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

  7. 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...

    近期搜刮了一些Spring全家桶系列的思维脑图.经典面试题和进阶学习的PDF笔记(非常nice),Spring+SpringCloud+SpringMVC+SpringBoot,一个都没落下全都有!一 ...

  8. Spring Web MVC是什么

    2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...

  9. spring框架mvc框架_Spring的MVC测试框架入门–第1部分

    spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...

最新文章

  1. Tomcat常见问题 (配置)及解决方法
  2. C++编程风格(一)
  3. 计算机vb选择题题题库,2013计算机二级VB真考选择题题库(4
  4. OpenCASCADE绘制测试线束:性能评估命令之VDrawSphere
  5. How to use price determination in Quotation scenario
  6. swiftui_SwiftUI的混合包
  7. “工业互联网平台“将成为工业制造企业的标配
  8. 【2018.3.17】模拟赛之二-ssl1862jzoj1366 删数【区间dp】
  9. javaweb调用python算法_请教怎么用java远程调用python? 多谢
  10. 苹果电脑 Mac OS X 系统诞生的故事和发展历史
  11. dj鲜生-08-用户注册的功能-上-实现注册的主逻辑和其本的验证功能-伴随着调试
  12. Flutter Button 图文分析、效果浏览
  13. 输入特定字符和只能输入数字。
  14. Segmentation and Paging
  15. C语言小游戏---扫雷
  16. UE4 蓝图教程(一) 开始,一个转动的香蕉
  17. 解决JSP中文乱码问题
  18. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
  19. 爬取初试----猫眼电影,猫眼评分
  20. github网站扩展增强

热门文章

  1. HDU2159(完全背包)
  2. 魔术方法 类 序列化_Java序列化魔术方法及其示例使用
  3. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
  4. apache.camel_Apache Camel 2.18发布–包含内容
  5. spring async_Spring Async和Java的8 CompletableFuture
  6. 绩效工作流_流绩效–您的想法
  7. javafx有布局管理器吗_JavaFX技巧17:带有AnchorPane的动画工作台布局
  8. jboss将war放在那?_将策略插入JBoss Apiman
  9. optaplanner_OptaPlanner –具有真实道路距离的车辆路线
  10. 您的JVM是否泄漏文件描述符-像我的一样?