溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?MVC項目中的異常處理怎么配置

發布時間:2022-06-07 09:38:42 來源:億速云 閱讀:172 作者:zzz 欄目:開發技術

Spring MVC項目中的異常處理怎么配置

在Spring MVC項目中,異常處理是一個非常重要的環節。良好的異常處理機制可以提高系統的健壯性,提升用戶體驗,并且有助于開發人員快速定位和解決問題。本文將詳細介紹如何在Spring MVC項目中配置異常處理。

1. 使用@ControllerAdvice@ExceptionHandler

@ControllerAdvice@ExceptionHandler是Spring MVC中用于全局異常處理的注解。通過這兩個注解,我們可以定義一個全局的異常處理類,集中處理所有控制器中拋出的異常。

1.1 創建全局異常處理類

首先,我們需要創建一個全局異常處理類,并使用@ControllerAdvice注解標記該類。然后,在該類中定義處理特定異常的方法,并使用@ExceptionHandler注解標記這些方法。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleGlobalException(Exception ex, WebRequest request) {
        // 處理全局異常
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
        // 處理資源未找到異常
        return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

1.2 自定義異常類

在上面的代碼中,我們處理了一個自定義的ResourceNotFoundException異常。我們可以通過創建一個自定義異常類來實現這一點。

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

1.3 在控制器中拋出異常

在控制器中,我們可以拋出這些自定義異常,Spring MVC會自動調用相應的異常處理方法。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/resource/{id}")
    public String getResource(@PathVariable Long id) {
        if (id == null) {
            throw new ResourceNotFoundException("Resource not found with id: " + id);
        }
        return "Resource found";
    }
}

2. 使用@ResponseStatus注解

@ResponseStatus注解可以用于自定義異常類上,指定當該異常拋出時返回的HTTP狀態碼。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

ResourceNotFoundException異常拋出時,Spring MVC會自動返回404狀態碼。

3. 使用HandlerExceptionResolver

HandlerExceptionResolver是Spring MVC中用于處理異常的接口。我們可以通過實現該接口來自定義異常處理邏輯。

3.1 實現HandlerExceptionResolver

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;

@Component
public class CustomHandlerExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        if (ex instanceof ResourceNotFoundException) {
            modelAndView.setViewName("error/404");
            modelAndView.addObject("errorMessage", ex.getMessage());
            response.setStatus(HttpStatus.NOT_FOUND.value());
        } else {
            modelAndView.setViewName("error/500");
            modelAndView.addObject("errorMessage", "An unexpected error occurred");
            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        }
        return modelAndView;
    }
}

3.2 配置HandlerExceptionResolver

在Spring MVC配置中,我們可以將自定義的HandlerExceptionResolver添加到DispatcherServlet的異常解析器列表中。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(customHandlerExceptionResolver());
    }

    @Bean
    public HandlerExceptionResolver customHandlerExceptionResolver() {
        return new CustomHandlerExceptionResolver();
    }
}

4. 使用ErrorController處理未捕獲的異常

ErrorController是Spring Boot中用于處理未捕獲異常的接口。我們可以通過實現該接口來自定義錯誤頁面或錯誤響應。

4.1 實現ErrorController

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        // 獲取錯誤狀態碼
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 404) {
            return "error/404";
        } else {
            return "error/500";
        }
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

4.2 配置錯誤頁面

src/main/resources/templates目錄下創建error/404.htmlerror/500.html文件,分別用于顯示404和500錯誤頁面。

<!-- error/404.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404 Not Found</title>
</head>
<body>
    <h1>404 Not Found</h1>
    <p>The requested resource was not found.</p>
</body>
</html>

<!-- error/500.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>500 Internal Server Error</title>
</head>
<body>
    <h1>500 Internal Server Error</h1>
    <p>An unexpected error occurred.</p>
</body>
</html>

5. 總結

在Spring MVC項目中,異常處理可以通過多種方式實現。@ControllerAdvice@ExceptionHandler注解提供了全局異常處理的機制,@ResponseStatus注解可以用于自定義異常的狀態碼,HandlerExceptionResolver接口允許我們自定義異常處理邏輯,而ErrorController接口則用于處理未捕獲的異常。通過合理配置這些機制,我們可以構建一個健壯且易于維護的異常處理系統。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女