溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中如何使用SpringMVC異常處理SimpleMappingExceptionResolver類

發(fā)布時(shí)間:2021-09-13 09:17:09 來(lái)源:億速云 閱讀:122 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹Java中如何使用SpringMVC異常處理SimpleMappingExceptionResolver類,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

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.

以上是“Java中如何使用SpringMVC異常處理SimpleMappingExceptionResolver類”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI