Spring 3.2 @ControllerAdvice批注的异常处理

不久前,我写了一个博客,概述了如何将Spring示例代码升级到3.2版,并演示了其中的一些小“陷阱”。 从那以后,我一直在仔细阅读Spring 3.2的新功能列表,尽管它不包含任何革命性的新更改,但我怀疑Spring的家伙正在为版本4保存,它确实包含了一些简洁的升级。 引起我注意的第一个是新的@ControllerAdvice批注,它似乎巧妙地填补了Spring 3功能的空白。 让我解释…

如果您看一下我关于Spring 3 MVC异常处理程序的博客,您会看到该示例代码包含一个带有请求处理程序方法的易碎控制器,该请求处理程序方法抛出
IOExceptionIOException然后由同一方法中的另一个方法处理 带有@ExceptionHandler(IOException.class)注释的控制器。 问题是,用@ExceptionHandler(IOException.class)注释的方法只能处理其包含的控制器抛出的IOException 。 如果要创建一个全局异常处理程序来处理所有控制器抛出的异常,则必须还原到诸如Spring 2的SimpleMapingExceptionHandler和一些XMLconfiguration之类的内容 。 现在情况有所不同。 为了演示@ControllerAdvice的用法,我创建了一个简单的Spring 3.2 MVC应用程序,您可以在github上找到它。 该应用程序的主页表面上允许用户显示其地址或信用卡详细信息,

…除非用户尝试执行此操作,否则关联的控制器将抛出一个
IOException ,应用程序显示以下错误页面:

生成异常的控制器非常简单,并在下面列出:

@Controller
public class UserCreditCardController {private static final Logger logger = LoggerFactory.getLogger(UserCreditCardController.class);/*** Whoops, throw an IOException*/@RequestMapping(value = "userdetails", method = RequestMethod.GET)public String getCardDetails(Model model) throws IOException {logger.info("This will throw an IOException");boolean throwException = true;if (throwException) {throw new IOException("This is my IOException");}return "home";}}
@Controller
public class UserAddressController {private static final Logger logger = LoggerFactory.getLogger(UserAddressController.class);/*** Whoops, throw an IOException*/@RequestMapping(value = "useraddress", method = RequestMethod.GET)public String getUserAddress(Model model) throws IOException {logger.info("This will throw an IOException");boolean throwException = true;if (throwException) {throw new IOException("This is my IOException");}return "home";}}

如您所见,此代码所做的全部工作就是将userdetailsuseraddress映射到getCardDetails(...)getUserAddress(...)方法。 当这些方法之一抛出IOException ,以下类将捕获该异常:

@ControllerAdvice
public class MyControllerAdviceDemo {private static final Logger logger = LoggerFactory.getLogger(MyControllerAdviceDemo.class);@Autowiredprivate UserDao userDao;/*** 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;}
}

上面的类由新的@ControllerAdvice注释注释,并且包含单个公共方法handleIOException(IOException.class) 。 此方法捕获上面的控制器抛出的所有IOException,生成包含一些相关用户信息的模型,然后显示和错误页面。 这样做的好处是,无论您的应用程序包含多少个控制器,当任何一个控制器抛出IOException ,它将由MyControllerAdviceDemo异常处理程序进行处理。

@ModelAttribute@InitBinder要记住的最后一件事是,尽管ControllerAdvice批注对于处理异常很有用,但也可以在全局处理@ModelAttribute@InitBinder批注时使用它。 ControllerAdvice@ModelAttribute的组合使您能够在一处为所有控制器设置模型对象,同样, ControllerAdvice@InitBinder的组合使您可以在同一位置将相同的自定义验证器附加到所有控制器。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes 提供的Spring 3.2 @ControllerAdvice注释的异常处理 。

翻译自: https://www.javacodegeeks.com/2013/03/exception-handling-with-the-spring-3-2-controlleradvice-annotation.html

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

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

相关文章

linux 进程与锁,linux 中的进程与锁

###################################################################################################################第五天###################################进程 所谓进程就是系统中正在执行的程序Permission denied (publickey,gssapi-keyex,gssapi-with-m…

用Java代码列出一个目录下所有的文件

1.File类 File类在java.io.File包中,所以要导入这个包。 File类中用到的方法: boolean isDirectory() 测试此抽象路径名表示的文件是否是个目录 File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的…

Bootstrap概述

前面的话 Bootstrap是简单、灵活的用于搭建WEB页面的HTML、CSS、Javascript的工具集。Bootstrap基于HTML5和CSS3,具有漂亮的设计、友好的学习曲线、卓越的兼容性,还有12列响应式栅格结构,丰富的组件等等。按照官网的宣传来说,Boot…

java.lang.IllegalStateException: Connection pool shut down

最近使用HttpClient 4.5 使用 CloseableHttpClient 发起连接后,使用CloseableHttpResponse 接受返回结果,结果就报错了,上网查了下,有位stackoverflow的大兄弟说,只要将: CloseableHttpClient httpClient HttpClie…

物资管理系统c语言课程设计,C语言实现仓库物资管理系统

前言此系统为博主大一上学期C语言课程设计的大作业,由于当时初步接触C语言,现在来看程序写的太烂了,简直不忍直视……但是还是想通过博客的形式记录下来,也可以给刚接触学习C语言的人一些参考吧!系统功能设计仓库初始化…

模板方法模式–使用Lambda表达式,默认方法

模板方法模式是Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides在著名的《 设计模式》一书中解释的23种设计模式之一。 这种模式的意图表示为: 在操作中定义算法的框架,将某些步骤推迟到子类。 TemplateMethod允许子类重…

DOM元素属性值如果设置为对象

结论:内部会调用toString方法,将设置的对象转换为字符串添加给相应的属性; 这个问题呢,是通过jQuery的each方法中,回调函数的this指向问题而来; 我们知道,回调函数中的this如果指向的是基本数据…

纯CSS3美化单选按钮radio

这种纯CSS3美化单选按钮radio的方法适用于以下情况: 1、可兼容IE9以上,需要兼容IE8的要写IE的hack把样式去掉 2、只支持单选按钮radio,因为单选按钮选中样式的圆圈可以用CSS做出来,但是复选按钮checkbox的选中效果对勾就需要图片…

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景【题目描述:】 在艾泽拉斯,有n个城市。编号为1…

模拟智能手环的时间显示功能 c语言,HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDF...

HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDFHT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例HT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例文件编码:AN0443S简介HT1635A/HT1635B是HOLTEK开发的一款带显示数据映像储存器…

训练残骸模式– Java 8中的改进实现

Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容,如下所示: >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联,但事实并非如此。 无论如何,让…

px、em、pt之间的区别与互相转换

关于px、pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之。点击查看原文(原网址已失效,这是其他站点) …

3.Apache ZooKeeper数据模型

1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务。 它旨在解决分布式应用程序中与组件协调相关的棘手问题。 它通过暴露一个简单而强大的接口来实现这一点。 应用程序可以设计在通过ZooKeeper API实现的这些接口上,以解决分布式同步&am…

STS插件_ springsource-tool-suite插件各个历史版本

目前spring官网(http://spring.io/tools/sts/all)上可下载的spring插件只有:springsource-tool-suite-3.8.4(sts-3.8.4)。但这只针对指定的eclipse版本适用。 原贴更精彩:http://blog.csdn.net/u010203767/article/details/69211072 sts-3.8.3的下载地址…

c语言中空格的占位符,HTML空格占位符

ScrollView 里的 EditText 与输入法的用例情景是这样的: 我希望页面可以滚动,因为长页面,内容多,必须滚动来满足不同手机的显示 点击 EditText 输入法弹出来,并将布局顶起来,并且EditText有足够的显示空间 进入页面时,输入法不能 ...decltype在C中,decltype作为操作符,用于查询…

仔细看看,您会发现需要改进的地方

我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使您的老板不要求也这样做。 这样做是因为您想要一些激动人心的工作时间。 重构是改变已经可以正常工作的艺术 。 但是要进行重构,您需要一个…

idea运行项目时报Error:java无效的源发行版:1.8

如果你安装的是JDK1.7,而在file->project structure中设置的是language level是8的话,就会出现这个错误提示:无效的源发行版:8。 解决办法:将语言级别改为7,或6。即语言级别不能高于你安装的版本。 另外…

0x123C语言,and esp, 0xfffffff0

问题I dont entirely understand the line with comment in it below. I read a few posts on SO and in the gcc manual and learned that it is for stack address alignment but fail to understand how it does so. The code is show below:(gdb) disas mainDump of assemb…

JUnit:在参数化测试中命名单个测试用例

几年前,我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例,因此,如果它们失败,您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思: 但是&#…

如何在 React Native 中写一个自定义模块

前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm,一般指两层含义:一是 Node.js 开放式模块登记和管理系统,另一种是…