亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringMVC全局異常處理小結(jié)

 更新時(shí)間:2024年03月29日 14:26:29   作者:周大福ye  
在開(kāi)發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類(lèi)型的異常處理從各處理過(guò)程解耦出來(lái),既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù),本文介紹SpringMVC全局異常處理,感興趣的朋友一起看看吧

一、為什么要全局異常處理?

我們知道,系統(tǒng)中異常包括:編譯時(shí)異常和運(yùn)行時(shí)異常RuntimeException,前者通過(guò)捕獲異常從而獲取異常信息,后者主要通過(guò)規(guī)范代碼開(kāi)發(fā)、測(cè)試通過(guò)手段減少運(yùn)行時(shí)異常的發(fā)生。在開(kāi)發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類(lèi)型的異常處理從各處理過(guò)程解耦出來(lái),既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。

二、異常處理思路(參考下圖)

三、SpringMVC異常分類(lèi)

   1)使用Spring MVC提供的簡(jiǎn)單異常處理器SimpleMappingExceptionResolver; 
   2)實(shí)現(xiàn)Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;
   3)使用@ControllerAdvice + @ExceptionHandler

四、綜合案例

1、首先創(chuàng)建一個(gè)error頁(yè)面,為方便后面異常處理操作

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>
    系統(tǒng)錯(cuò)誤,請(qǐng)聯(lián)系管理員??!
</h1>
${msg}
</body>
</html>

 4.1 SpringMVC自帶的簡(jiǎn)單異常處理器

  SpringMVC中自帶了一個(gè)異常處理器叫SimpleMappingExceptionResolver,該處理器實(shí)現(xiàn)了HandlerExceptionResolver 接口,全局異常處理器都需要實(shí)現(xiàn)該接口

1)配置SpringMVC簡(jiǎn)單異常處理器

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <!-- 定義默認(rèn)的異常處理頁(yè)面 -->
       <property name="defaultErrorView" value="error"/>
       <!-- 定義異常處理頁(yè)面用來(lái)獲取異常信息的變量名,也可不定義,默認(rèn)名為exception --> 
       <property name="exceptionAttribute" value="ex"/>
       <!-- 定義需要特殊處理的異常,這是重要點(diǎn) --> 
       <property name="exceptionMappings">
           <props> <!--異常類(lèi)型 錯(cuò)誤視圖-->       
               <prop key="java.lang.RuntimeException">error</prop>
           </props>
           <!-- 還可以定義其他的自定義異常 -->
       </property>
   </bean> 

2)方法中拋出此異常

 /**
     * 返回實(shí)體類(lèi)的JSON數(shù)據(jù)
     * @param bookId
     * @return
     */
   @RequestMapping("/querySingleBook")
   @ResponseBody
   public Book querySingleBook(Integer bookId){
       Book book = bookService.selectByPrimaryKey(bookId);
       book.setCreatedate(new Date());
       //此處只是為了進(jìn)行案例演示
       if(bookId<100){
           throw new RuntimeException("查詢(xún)的書(shū)本編號(hào)小于100,異常拋出??!");
       }
       return book;
   }

3)頁(yè)面效果

4.2 通過(guò)HandlerExceptionResovler接口實(shí)現(xiàn)全局異常  

   注:
   1)通過(guò)instanceof判斷異常類(lèi)型
   2)通過(guò)設(shè)置mv.setView(new MappingJackson2JsonView())方式返回JSON數(shù)據(jù);

 1)通過(guò)HandlerExceptionResovler接口實(shí)現(xiàn)全局異常處理器

package com.zking.ssm.book.exception;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * SpingMVC提供的第二種全局異常處理方式  ,實(shí)現(xiàn)HandlerExceptionResolver接口
 */
@Component
public class GlobalException implements HandlerExceptionResolver {
    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o 異常處理的目標(biāo)
     * @param e 異常處理的類(lèi)型
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("error");
        //判斷異常的分類(lèi)
        if(e instanceof RuntimeException){
                RuntimeException ex=(RuntimeException)e;
                System.out.println(ex.getMessage());
                mv.addObject("msg",ex.getMessage());
        }
        return mv;
    }
}

2)創(chuàng)建異常類(lèi)

package com.zking.ssm.book.exception;
public class BusinessException extends RuntimeException {
    public BusinessException() {
    }
    public BusinessException(String message) {
        super(message);
    }
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
    }
    public BusinessException(Throwable cause) {
        super(cause);
    }
}
@RequestMapping("/querySingleBook")
    @ResponseBody
    public Book querySingleBook(Integer bookId){
        Book book = bookService.selectByPrimaryKey(bookId);
        if(bookId>100)
            throw new BusinessException("書(shū)本編號(hào)小于100,異常拋出?。。?);
        book.setDate(new Date());
        return book;
    }

3)頁(yè)面效果

4.3 使用@ControllerAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常

 1)創(chuàng)建全局異常處理器

package com.zking.ssm.book.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map;
/**
 * SpingMVC提供的第三種種全局異常處理方式
 * 1)@ControllerAdvice +@ExceptionHandler
 * 2)@RestControllerAdvice +@ExceptionHandler
 *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的數(shù)據(jù)格式,繞開(kāi)視圖解析器
 */
@ControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public ModelAndView exceptionHandler(Exception e){
            ModelAndView mv=new ModelAndView();
            //設(shè)置錯(cuò)誤頁(yè)面
            mv.setViewName("error");
            //判斷異常類(lèi)型
            if(e instanceof BusinessException){
            BusinessException ex=(BusinessException)e;
                mv.addObject("msg","系統(tǒng)繁忙,請(qǐng)稍后再試.......");
            }
            mv.setView(new MappingJackson2JsonView());
            return mv;
        }
}

2)頁(yè)面效果

3)返回異常信息和狀態(tài)碼、返回JSON數(shù)據(jù)格式

package com.zking.ssm.book.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map;
/**
 * SpingMVC提供的第三種種全局異常處理方式
 * 1)@ControllerAdvice +@ExceptionHandler
 * 2)@RestControllerAdvice +@ExceptionHandler
 *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的數(shù)據(jù)格式,繞開(kāi)視圖解析器
 */
@RestControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public Map<String, Object> exceptionHandler(Exception e){
            Map<String, Object> json=new HashMap();
            //判斷異常類(lèi)型
            if(e instanceof BusinessException){
                json.put("msg","系統(tǒng)繁忙,請(qǐng)稍后再試.......");
                json.put("code",500);
            }
            return json;
        }
}

4)頁(yè)面效果

 希望可以給您帶來(lái)幫助,若有建議可以私信作者哦~

到此這篇關(guān)于SpringMVC之全局異常處理的文章就介紹到這了,更多相關(guān)SpringMVC全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁(yè)查詢(xún)的顯示問(wèn)題,針對(duì)于此,這里我們就來(lái)詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來(lái)回顧一下MyBatis的緩存機(jī)制與執(zhí)行:
    2016-06-06
  • 詳解Java枚舉為什么是單例模式的最佳選擇

    詳解Java枚舉為什么是單例模式的最佳選擇

    這篇文章主要為大家詳細(xì)介紹了Java枚舉為什么是單例模式的最佳選擇,文中通過(guò)簡(jiǎn)單的示例進(jìn)行了講解,具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-05-05
  • 基于java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng)

    基于java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng)

    這篇文章主要介紹了基于java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Spring?@Cacheable讀取配置常量方式

    Spring?@Cacheable讀取配置常量方式

    這篇文章主要介紹了Spring?@Cacheable讀取配置常量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot在idea下debug調(diào)試熱部署問(wèn)題

    springboot在idea下debug調(diào)試熱部署問(wèn)題

    這篇文章主要介紹了springboot在idea下debug調(diào)試熱部署問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換

    Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換

    有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解

    MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解

    本文通過(guò)實(shí)例代碼給大家介紹了MyBatis動(dòng)態(tài)SQL標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-07-07
  • java使用XSSFWorkbook實(shí)現(xiàn)讀寫(xiě)Excel

    java使用XSSFWorkbook實(shí)現(xiàn)讀寫(xiě)Excel

    這篇文章主要為大家詳細(xì)介紹了java如何通過(guò)使用XSSFWorkbook實(shí)現(xiàn)讀寫(xiě)Excel功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Java中Semaphore(信號(hào)量)的使用方法

    Java中Semaphore(信號(hào)量)的使用方法

    這篇文章主要介紹了Java中Semaphore(信號(hào)量)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java多線(xiàn)程并發(fā)executorservice(任務(wù)調(diào)度)類(lèi)

    java多線(xiàn)程并發(fā)executorservice(任務(wù)調(diào)度)類(lèi)

    這篇文章主要介紹了線(xiàn)程并發(fā)ScheduledExecutorService類(lèi),設(shè)置 ScheduledExecutorService ,2秒后,在 1 分鐘內(nèi)每 10 秒鐘蜂鳴一次
    2014-01-01

最新評(píng)論