在Spring MVC項目中,異常處理是一個非常重要的環節。良好的異常處理機制可以提高系統的健壯性,提升用戶體驗,并且有助于開發人員快速定位和解決問題。本文將詳細介紹如何在Spring MVC項目中配置異常處理。
@ControllerAdvice
和@ExceptionHandler
@ControllerAdvice
和@ExceptionHandler
是Spring MVC中用于全局異常處理的注解。通過這兩個注解,我們可以定義一個全局的異常處理類,集中處理所有控制器中拋出的異常。
首先,我們需要創建一個全局異常處理類,并使用@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);
}
}
在上面的代碼中,我們處理了一個自定義的ResourceNotFoundException
異常。我們可以通過創建一個自定義異常類來實現這一點。
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
在控制器中,我們可以拋出這些自定義異常,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";
}
}
@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狀態碼。
HandlerExceptionResolver
HandlerExceptionResolver
是Spring MVC中用于處理異常的接口。我們可以通過實現該接口來自定義異常處理邏輯。
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;
}
}
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();
}
}
ErrorController
處理未捕獲的異常ErrorController
是Spring Boot中用于處理未捕獲異常的接口。我們可以通過實現該接口來自定義錯誤頁面或錯誤響應。
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";
}
}
在src/main/resources/templates
目錄下創建error/404.html
和error/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>
在Spring MVC項目中,異常處理可以通過多種方式實現。@ControllerAdvice
和@ExceptionHandler
注解提供了全局異常處理的機制,@ResponseStatus
注解可以用于自定義異常的狀態碼,HandlerExceptionResolver
接口允許我們自定義異常處理邏輯,而ErrorController
接口則用于處理未捕獲的異常。通過合理配置這些機制,我們可以構建一個健壯且易于維護的異常處理系統。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。