Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解
Spring3.0 對(duì)異常的處理方式總共有兩種:
一種是使用 HandlerExceptionResolver 接口,并且 Spring 已經(jīng)提供默認(rèn)的實(shí)現(xiàn)類 SimpleMappingExceptionResolver。
第二種方法是在 Controller 內(nèi)部實(shí)現(xiàn),靈活性更高。
從目前的調(diào)查結(jié)果來(lái)看,這兩種方式不能共存。我們一般在項(xiàng)目中使用第一種方法。
下面分別描述一下這兩種使用方式:
一、基于 HandlerExceptionResolver 接口的方式
使用這種方式只需要實(shí)現(xiàn) resolveException 方法,該方法返回一個(gè) ModelAndView 對(duì)象,在方法內(nèi)部對(duì)異常的類型進(jìn)行判斷,然后返回合適的 ModelAndView 對(duì)象,如果該方法返回了 null,則 Spring 會(huì)繼續(xù)尋找其他的實(shí)現(xiàn)了 HandlerExceptionResolver 接口的 Bean。換句話說(shuō),Spring 會(huì)搜索所有注冊(cè)在其環(huán)境中的實(shí)現(xiàn)了 HandlerExceptionResolver 接口的 Bean,逐個(gè)執(zhí)行,直到返回了一個(gè) ModelAndView 對(duì)象。
public class CustomExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object object, Exception exception) {
if(exception instanceof IOException){
return new ModelAndView("ioexp");
}else if(exception instanceof SQLException){
return new ModelAndView("sqlexp");
}
return null;
}
}
這個(gè)類必須聲明到 Spring 配置文件中,或者使用 @Component 標(biāo)簽,讓 Spring 管理它。同時(shí) Spring 也提供默認(rèn)的實(shí)現(xiàn)類 SimpleMappingExceptionResolver,需要使用時(shí)只需要使用注入到 Spring 配置文件進(jìn)行聲明即可。自定義實(shí)現(xiàn)類與默認(rèn)的實(shí)現(xiàn)類,可同時(shí)使用。
示例如下:
<!-- 自定義的實(shí)現(xiàn)類 --><bean id="exceptionHandler" class="com.enh.test.CustomExceptionHandler"/><!-- 默認(rèn)的實(shí)現(xiàn)類注入 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 為所有的異常定義默認(rèn)的異常處理頁(yè)面,exceptionMappings未定義的異常使用本默認(rèn)配置 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定義異常處理頁(yè)面用來(lái)獲取異常信息的變量名,默認(rèn)名為exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定義需要特殊處理的異常,用類名或完全路徑名作為key,異常頁(yè)文件名作為值, 將不同的異常映射到不同的頁(yè)面上?! ?-->
<property name="exceptionMappings">
<props>
<prop key="IOException">error/ioexp</prop>
<prop key="java.sql.SQLException">error/sqlexp</prop>
</props>
</property>
</bean>
一個(gè)典型的異常顯示界面如下:
<html>
<head><title>Exception!</title></head>
<body>
<% Exception ex = (Exception)request.getAttribute("exception"); %>
<H2>Exception: <%= ex.getMessage();%></H2>
<P/>
<% ex.printStackTrace(new java.io.PrintWriter(out)); %>
</body>
</html>
exception 是在 SimpleMappingExceptionResolver 被存放到 request 中的,具體可以查看源代碼。
另外這里配置的異常顯示界面均僅包括主文件名,至于文件路徑和后綴已經(jīng)在 viewResolver 中指定。如果找不到頁(yè)面,會(huì)根據(jù)錯(cuò)誤提示再調(diào)整頁(yè)面路徑。
二、Controller 內(nèi)部單獨(dú)實(shí)現(xiàn)
該方法需要定義在 Controller 內(nèi)部,然后創(chuàng)建一個(gè)方法并用 @ExceptionHandler 注解來(lái)修飾用來(lái)處理異常,這個(gè)方法基本和 @RequestMapping 修飾的方法差不多,只是可以多一個(gè)類型為 Exception 的參數(shù),@ExceptionHandler 中可以添加一個(gè)或多個(gè)異常的類型,如果為空的話則認(rèn)為可以觸發(fā)所有的異常類型錯(cuò)誤。
@Controller
public class ExceptionHandlerController {
@ExceptionHandler(value={IOException.class,SQLException.class})
public String exp(Exception ex,HttpServletRequest request) {
request.setAttribute("ex", ex);
return "/error.jsp";
}
}
三、相關(guān)問(wèn)題
HandlerExceptionResolver 和 web.xml 中配置的 error-page 會(huì)有沖突嗎?
web.xml 中配置 error-page 同樣是配置出現(xiàn)錯(cuò)誤時(shí)顯示的頁(yè)面:
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
如果 resolveException 返回了 ModelAndView,會(huì)優(yōu)先根據(jù)返回值中的頁(yè)面來(lái)顯示。不過(guò),resolveException 可以返回 null,此時(shí)則展示 web.xml 中的 error-page 的500狀態(tài)碼配置的頁(yè)面。
API 文檔中對(duì)返回值的解釋:
return a corresponding ModelAndView to forward to, or null for default processing.
到此這篇關(guān)于SpringMVC 異常處理SimpleMappingExceptionResolver類詳解的文章就介紹到這了,更多相關(guān)SpringMVC 異常處理SimpleMappingExceptionResolver類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用CompletableFuture實(shí)現(xiàn)異步編程
在現(xiàn)代 Java 開(kāi)發(fā)中,異步編程是一項(xiàng)重要技能,而 CompletableFuture 是從 Java 8 開(kāi)始提供的一個(gè)功能強(qiáng)大的工具,用于簡(jiǎn)化異步任務(wù)的編寫和組合,本文將詳細(xì)介紹 CompletableFuture 的基本使用和一些常見(jiàn)的應(yīng)用場(chǎng)景,需要的朋友可以參考下2025-01-01
springboot對(duì)壓縮請(qǐng)求的處理方法
這篇文章主要介紹了springboot對(duì)壓縮請(qǐng)求的處理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java ThreadPoolExecutor 線程池的使用介紹
Executors 是一個(gè)Java中的工具類. 提供工廠方法來(lái)創(chuàng)建不同類型的線程池,這篇文章主要介紹了Java ThreadPoolExecutor 線程池的使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解
這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
java結(jié)合email實(shí)現(xiàn)自動(dòng)推送功能
這篇文章主要介紹了java結(jié)合email實(shí)現(xiàn)自動(dòng)推送功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
JeecgBoot框架升級(jí)至Spring?Boot3的實(shí)戰(zhàn)步驟
本文主要介紹了JeecgBoot框架升級(jí)至Spring?Boot3的實(shí)戰(zhàn)步驟,從?2.7.10升級(jí)到3.1.5有以下幾個(gè)點(diǎn)需要注意,下面就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-04-04
Java實(shí)現(xiàn)布隆過(guò)濾器的幾種方式總結(jié)
這篇文章給大家總結(jié)了幾種Java實(shí)現(xiàn)布隆過(guò)濾器的方式,手動(dòng)硬編碼實(shí)現(xiàn),引入Guava實(shí)現(xiàn),引入hutool實(shí)現(xiàn),通過(guò)redis實(shí)現(xiàn)等幾種方式,文中有詳細(xì)的代碼和圖解,需要的朋友可以參考下2023-07-07
spring使用WebSocket注入service層失敗問(wèn)題及解決
這篇文章主要介紹了spring使用WebSocket注入service層失敗問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

