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.pswp.cn/news/373385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373385.shtml
英文地址,請注明出處:http://en.pswp.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類最重要的優點是支持數據庫以斷開…