最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring?MVC優(yōu)雅處理異常的6種方式

 更新時(shí)間:2024年12月19日 08:25:11   作者:猿java  
在Spring中提供了多種機(jī)制來(lái)處理控制器拋出的異常,確保應(yīng)用程序在面對(duì)各種錯(cuò)誤情況時(shí)能夠優(yōu)雅地響應(yīng),本文我們來(lái)詳細(xì)分析Spring?MVC中6種優(yōu)雅處理異常的方式,需要的可以參考下

異常處理是每個(gè) Java程序員需要面對(duì)的一個(gè)問題,在Spring中,提供了多種機(jī)制來(lái)處理控制器拋出的異常,確保應(yīng)用程序在面對(duì)各種錯(cuò)誤情況時(shí)能夠優(yōu)雅地響應(yīng)。這篇文章,我們來(lái)詳細(xì)分析Spring MVC中,幾種優(yōu)雅處理異常的方式。

1. 使用@ExceptionHandler注解

@ExceptionHandler注解允許在單個(gè)Controller中定義處理特定異常的方法。當(dāng) Controller的方法拋出指定的異常時(shí),Spring會(huì)調(diào)用相應(yīng)的處理方法。

如下示例,展示了如何在 Controller層優(yōu)雅處理異常:

@Controller
public class MyController {

    @RequestMapping("/example")
    public String example() {
        // 可能拋出異常的業(yè)務(wù)邏輯
        if (1/0) {
            throw new CustomException("自定義異常發(fā)生");
        }
        return "success";
    }

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(CustomException ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("message", ex.getMessage());
        mav.setViewName("errorPage");
        return mav;
    }
}

優(yōu)點(diǎn): 簡(jiǎn)單直觀,適用于單個(gè)控制器的異常處理。

缺點(diǎn): 如果多個(gè)控制器需要相同的異常處理邏輯,需要在每個(gè)控制器中重復(fù)定義。

2. 使用@ControllerAdvice注解

@ControllerAdvice是一種全局的異常處理方式,可以應(yīng)用于所有 Controller。通過將異常處理邏輯集中在一個(gè)地方,可以避免代碼重復(fù),提高維護(hù)性。

如下示例,展示了如何使用@ControllerAdvice優(yōu)雅處理全局異常:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(CustomException ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("message", ex.getMessage());
        mav.setViewName("errorPage");
        return mav;
    }

    @ExceptionHandler(Exception.class)
    public ModelAndView handleGeneralException(Exception ex) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("message", "發(fā)生了一個(gè)錯(cuò)誤: " + ex.getMessage());
        mav.setViewName("errorPage");
        return mav;
    }
}

優(yōu)點(diǎn):

  • 全局統(tǒng)一管理異常處理邏輯。
  • 代碼更清晰,易于維護(hù)。

缺點(diǎn):

  • 全局處理不適用于需要針對(duì)某些控制器有特殊處理需求的情況,需結(jié)合其他方法使用。

3. 實(shí)現(xiàn)HandlerExceptionResolver接口

HandlerExceptionResolver 是一種更底層的異常處理機(jī)制,通過實(shí)現(xiàn)該接口,開發(fā)者可以自定義異常解析邏輯。

如下示例,展示了如何實(shí)現(xiàn)HandlerExceptionResolver接口優(yōu)雅處理異常:

public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler,
                                         Exception ex) {
        ModelAndView mav = new ModelAndView();
        if (ex instanceof CustomException) {
            mav.addObject("message", ex.getMessage());
            mav.setViewName("customErrorPage");
        } else {
            mav.addObject("message", "未知錯(cuò)誤");
            mav.setViewName("errorPage");
        }
        return mav;
    }
}

配置:

在 Spring 配置文件中注冊(cè)自定義異常解析器:

<bean class="com.example.MyExceptionResolver"/>

優(yōu)點(diǎn):

高度靈活,可以處理各種復(fù)雜的異常情景。

缺點(diǎn):

  • 需要更多的配置和實(shí)現(xiàn)工作。
  • 不如注解方式直觀,適用性較低。

4. 使用@ResponseStatus注解

@ResponseStatus注解可以用于自定義異常對(duì)應(yīng)的 HTTP 狀態(tài)碼和錯(cuò)誤信息,當(dāng)拋出帶有該注解的異常時(shí),Spring會(huì)自動(dòng)設(shè)置相應(yīng)的狀態(tài)碼。

如下示例,展示了如何使用@ResponseStatus注解優(yōu)雅處理異常:

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "資源未找到")
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

使用:

@Controller
public class MyController {

    @RequestMapping("/resource")
    public String getResource() {
        // 假設(shè)資源未找到
        throw new ResourceNotFoundException("資源ID不存在");
    }
}

優(yōu)點(diǎn):

簡(jiǎn)單快捷,適用于直接映射到特定 HTTP 狀態(tài)碼的異常情況。

缺點(diǎn):

無(wú)法返回自定義的錯(cuò)誤頁(yè)面或更復(fù)雜的錯(cuò)誤信息。

5. 使用ResponseEntity和@RestControllerAdvice

在構(gòu)建 RESTful API時(shí),常用ResponseEntity來(lái)返回自定義的錯(cuò)誤響應(yīng),并結(jié)合@RestControllerAdvice可以全局處理異常并返回 JSON 格式的錯(cuò)誤信息。

如下示例,展示了如何使用ResponseEntity@RestControllerAdvice來(lái)處理 RESTful API的異常:

@RestControllerAdvice
public class RestExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
        ErrorResponse error = new ErrorResponse("CUSTOM_ERROR", ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {
        ErrorResponse error = new ErrorResponse("GENERAL_ERROR", "內(nèi)部服務(wù)器錯(cuò)誤");
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

public class ErrorResponse {
    private String errorCode;
    private String errorMessage;

    // 構(gòu)造方法、getter 和 setter
}

優(yōu)點(diǎn):

  • 適用于 RESTful 服務(wù),能夠返回結(jié)構(gòu)化的錯(cuò)誤信息(如 JSON)。
  • 全局統(tǒng)一管理,易于維護(hù)。

缺點(diǎn):

需要定義額外的錯(cuò)誤響應(yīng)類。

6. 使用@ControllerAdvice和@ExceptionHandler

如果使用 Spring Boot,可以更便捷地使用 @ControllerAdvice 結(jié)合自動(dòng)配置實(shí)現(xiàn)異常處理。

如下示例,展示了如何使用@ControllerAdvice@ExceptionHandler來(lái)處理異常:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ValidationErrorResponse> handleValidationExceptions(
            MethodArgumentNotValidException ex) {
        ValidationErrorResponse errors = new ValidationErrorResponse();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            errors.addError(((FieldError) error).getField(), error.getDefaultMessage());
        });
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }

    // 其它異常處理方法
}

優(yōu)點(diǎn):

  • 與 Spring Boot 無(wú)縫集成,減少配置。
  • 提供了諸多便利的功能,如自動(dòng)處理驗(yàn)證錯(cuò)誤等。

7. 總結(jié)

本文,我們分析了 Spring MVC優(yōu)雅處理異常的幾種方法以及代碼示例,我們可以根據(jù)具體需求選擇合適的方法:

  • 局部控制器處理:使用 @ExceptionHandler 注解,適用于單個(gè)控制器的特定異常處理。
  • 全局處理:使用 @ControllerAdvice@RestControllerAdvice,適用于跨多個(gè)控制器的統(tǒng)一異常處理。
  • 自定義解析:實(shí)現(xiàn) HandlerExceptionResolver 接口,適用于需要高度自定義的異常處理邏輯。
  • 狀態(tài)碼注解:使用 @ResponseStatus 注解,適用于簡(jiǎn)單的異常狀態(tài)碼映射。
  • RESTful API:結(jié)合 ResponseEntity 和全局異常處理,返回結(jié)構(gòu)化的錯(cuò)誤響應(yīng)。

從實(shí)際工作來(lái)看,@ControllerAdvice@RestControllerAdvice是使用頻率最高的一種方式。

到此這篇關(guān)于詳解Spring MVC優(yōu)雅處理異常的6種方式的文章就介紹到這了,更多相關(guān)Spring MVC處理異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java學(xué)習(xí)筆記之異常處理

    Java學(xué)習(xí)筆記之異常處理

    這篇文章主要為大家詳細(xì)介紹了Java學(xué)習(xí)筆記之異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • SpringBoot Shiro權(quán)限管理方式

    SpringBoot Shiro權(quán)限管理方式

    這篇文章主要介紹了SpringBoot Shiro權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Mybatis查不到數(shù)據(jù)查詢返回Null問題

    Mybatis查不到數(shù)據(jù)查詢返回Null問題

    mybatis突然查不到數(shù)據(jù),查詢返回的都是Null,但是 select count(*) from xxx查詢數(shù)量,返回卻是正常的。好多朋友遇到這樣的問題不知所措,下面小編通過本教程簡(jiǎn)單給大家說(shuō)明下
    2016-08-08
  • SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼

    SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 聊聊為什么要使用BufferedReader讀取File

    聊聊為什么要使用BufferedReader讀取File

    這篇文章主要介紹了為什么要使用BufferedReader讀取File,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot實(shí)現(xiàn)PDF轉(zhuǎn)圖片的代碼示例

    SpringBoot實(shí)現(xiàn)PDF轉(zhuǎn)圖片的代碼示例

    在本文中,我們使用SpringBoot演示了如何將PDF文件轉(zhuǎn)換為一張或多張圖片,這些示例演示了如何使用Java編程語(yǔ)言與其他開源技術(shù)集成,以實(shí)現(xiàn)各種文件格式之間的轉(zhuǎn)換,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-08-08
  • java分割日期時(shí)間段代碼

    java分割日期時(shí)間段代碼

    這篇文章主要為大家詳細(xì)介紹了java分割日期時(shí)間段代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • SpringCloud的網(wǎng)關(guān)Zuul和Gateway詳解

    SpringCloud的網(wǎng)關(guān)Zuul和Gateway詳解

    SpringCloudZuul和SpringCloudGateway都是用于構(gòu)建微服務(wù)架構(gòu)中的API網(wǎng)關(guān)的組件,但SpringCloudGateway在性能、功能特性和生態(tài)支持等方面有一些優(yōu)勢(shì),因此推薦使用SpringCloudGateway作為首選
    2025-02-02
  • java實(shí)現(xiàn)圖片上傳至本地實(shí)例詳解

    java實(shí)現(xiàn)圖片上傳至本地實(shí)例詳解

    我們給大家分享了關(guān)于java實(shí)現(xiàn)圖片上傳至本地的實(shí)例以及相關(guān)代碼,有需要的朋友參考下。
    2018-08-08
  • 修改jvm-sandbox源碼導(dǎo)致線程安全分析

    修改jvm-sandbox源碼導(dǎo)致線程安全分析

    這篇文章主要為大家介紹了修改jvm-sandbox源碼導(dǎo)致線程安全分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論

丹东市| 门源| 翼城县| 高尔夫| 滦南县| 营口市| 西丰县| 普陀区| 彰武县| 博湖县| 甘谷县| 尖扎县| 盐池县| 三原县| 庆城县| 镇巴县| 新密市| 靖宇县| 四会市| 彰武县| 高安市| 新疆| 吐鲁番市| 开江县| 淮北市| 阳新县| 兴安县| 苍南县| 永仁县| 定南县| 盱眙县| 隆安县| 新巴尔虎右旗| 长春市| 凌源市| 临泉县| 防城港市| 利辛县| 霍林郭勒市| 阜宁县| 庐江县|