欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

三、SpringMVC異常分類

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

四、綜合案例

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

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

 4.1 SpringMVC自帶的簡單異常處理器

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

1)配置SpringMVC簡單異常處理器

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

2)方法中拋出此異常

 /**
     * 返回實(shí)體類的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("查詢的書本編號小于100,異常拋出?。?);
       }
       return book;
   }

3)頁面效果

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

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

 1)通過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 異常處理的類型
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("error");
        //判斷異常的分類
        if(e instanceof RuntimeException){
                RuntimeException ex=(RuntimeException)e;
                System.out.println(ex.getMessage());
                mv.addObject("msg",ex.getMessage());
        }
        return mv;
    }
}

2)創(chuàng)建異常類

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("書本編號小于100,異常拋出?。?!");
        book.setDate(new Date());
        return book;
    }

3)頁面效果

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ù)格式,繞開視圖解析器
 */
@ControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public ModelAndView exceptionHandler(Exception e){
            ModelAndView mv=new ModelAndView();
            //設(shè)置錯(cuò)誤頁面
            mv.setViewName("error");
            //判斷異常類型
            if(e instanceof BusinessException){
            BusinessException ex=(BusinessException)e;
                mv.addObject("msg","系統(tǒng)繁忙,請稍后再試.......");
            }
            mv.setView(new MappingJackson2JsonView());
            return mv;
        }
}

2)頁面效果

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ù)格式,繞開視圖解析器
 */
@RestControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public Map<String, Object> exceptionHandler(Exception e){
            Map<String, Object> json=new HashMap();
            //判斷異常類型
            if(e instanceof BusinessException){
                json.put("msg","系統(tǒng)繁忙,請稍后再試.......");
                json.put("code",500);
            }
            return json;
        }
}

4)頁面效果

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    這篇文章主要介紹了springboot在idea下debug調(diào)試熱部署問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(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)切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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í)例詳解

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

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

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

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

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

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

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

最新評論