IT评测·应用市场-qidao123.com技术社区

标题: Spring MVC 中,处置惩罚异常的 6种方式 [打印本页]

作者: 自由的羽毛    时间: 2024-12-21 23:09
标题: Spring MVC 中,处置惩罚异常的 6种方式
异常处置惩罚是每个 Java步伐员需要面临的一个问题,在Spring中,提供了多种机制来处置惩罚控制器抛出的异常,确保应用步伐在面临各种错误情况时能够优雅地响应。这篇文章,我们来详细分析Spring MVC中,几种优雅处置惩罚异常的方式。
1. 利用@ExceptionHandler注解

@ExceptionHandler注解允许在单个Controller中界说处置惩罚特定异常的方法。当 Controller的方法抛出指定的异常时,Spring会调用相应的处置惩罚方法。
如下示例,展示了如何在 Controller层优雅处置惩罚异常:
  1. @Controller
  2. public class MyController {
  3.     @RequestMapping("/example")
  4.     public String example() {
  5.         // 可能抛出异常的业务逻辑
  6.         if (1/0) {
  7.             throw new CustomException("自定义异常发生");
  8.         }
  9.         return "success";
  10.     }
  11.     @ExceptionHandler(CustomException.class)
  12.     public ModelAndView handleCustomException(CustomException ex) {
  13.         ModelAndView mav = new ModelAndView();
  14.         mav.addObject("message", ex.getMessage());
  15.         mav.setViewName("errorPage");
  16.         return mav;
  17.     }
  18. }
复制代码
优点: 简朴直观,实用于单个控制器的异常处置惩罚。
缺点: 假如多个控制器需要相同的异常处置惩罚逻辑,需要在每个控制器中重复界说。
2. 利用@ControllerAdvice注解

@ControllerAdvice是一种全局的异常处置惩罚方式,可以应用于所有 Controller。通过将异常处置惩罚逻辑集中在一个地方,可以避免代码重复,提高维护性。
如下示例,展示了如何利用 @ControllerAdvice 优雅处置惩罚全局异常:
  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(CustomException.class)
  4.     public ModelAndView handleCustomException(CustomException ex) {
  5.         ModelAndView mav = new ModelAndView();
  6.         mav.addObject("message", ex.getMessage());
  7.         mav.setViewName("errorPage");
  8.         return mav;
  9.     }
  10.     @ExceptionHandler(Exception.class)
  11.     public ModelAndView handleGeneralException(Exception ex) {
  12.         ModelAndView mav = new ModelAndView();
  13.         mav.addObject("message", "发生了一个错误: " + ex.getMessage());
  14.         mav.setViewName("errorPage");
  15.         return mav;
  16.     }
  17. }
复制代码
优点:

缺点:

3. 实现HandlerExceptionResolver接口

HandlerExceptionResolver 是一种更底层的异常处置惩罚机制,通过实现该接口,开发者可以自界说异常解析逻辑。
如下示例,展示了如何实现 HandlerExceptionResolver接口优雅处置惩罚异常:
  1. public class MyExceptionResolver implements HandlerExceptionResolver {
  2.     @Override
  3.     public ModelAndView resolveException(HttpServletRequest request,
  4.                                          HttpServletResponse response,
  5.                                          Object handler,
  6.                                          Exception ex) {
  7.         ModelAndView mav = new ModelAndView();
  8.         if (ex instanceof CustomException) {
  9.             mav.addObject("message", ex.getMessage());
  10.             mav.setViewName("customErrorPage");
  11.         } else {
  12.             mav.addObject("message", "未知错误");
  13.             mav.setViewName("errorPage");
  14.         }
  15.         return mav;
  16.     }
  17. }
复制代码
配置
在 Spring 配置文件中注册自界说异常解析器:
  1. <bean class="com.example.MyExceptionResolver"/>
复制代码
优点

缺点

4. 利用@ResponseStatus注解

@ResponseStatus注解可以用于自界说异常对应的 HTTP 状态码和错误信息,当抛出带有该注解的异常时,Spring会自动设置相应的状态码。
如下示例,展示了如何利用 @ResponseStatus注解优雅处置惩罚异常:
  1. @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "资源未找到")
  2. public class ResourceNotFoundException extends RuntimeException {
  3.     public ResourceNotFoundException(String message) {
  4.         super(message);
  5.     }
  6. }
复制代码
利用:
  1. @Controller
  2. public class MyController {
  3.     @RequestMapping("/resource")
  4.     public String getResource() {
  5.         // 假设资源未找到
  6.         throw new ResourceNotFoundException("资源ID不存在");
  7.     }
  8. }
复制代码
优点:

缺点:

5. 利用ResponseEntity和@RestControllerAdvice

在构建 RESTful API时,常用ResponseEntity来返回自界说的错误响应,并结合 @RestControllerAdvice可以全局处置惩罚异常并返回 JSON 格式的错误信息。
如下示例,展示了如何利用ResponseEntity和*@RestControllerAdvice*来处置惩罚 RESTful API的异常:
  1. @RestControllerAdvice
  2. public class RestExceptionHandler {
  3.     @ExceptionHandler(CustomException.class)
  4.     public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
  5.         ErrorResponse error = new ErrorResponse("CUSTOM_ERROR", ex.getMessage());
  6.         return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
  7.     }
  8.     @ExceptionHandler(Exception.class)
  9.     public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {
  10.         ErrorResponse error = new ErrorResponse("GENERAL_ERROR", "内部服务器错误");
  11.         return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
  12.     }
  13. }
  14. public class ErrorResponse {
  15.     private String errorCode;
  16.     private String errorMessage;
  17.     // 构造方法、getter 和 setter
  18. }
复制代码
优点

缺点

6. 利用@ControllerAdvice和@ExceptionHandler

假如利用 Spring Boot,可以更便捷地利用 @ControllerAdvice 结合自动配置实现异常处置惩罚。
如下示例,展示了如何利用 @ControllerAdvice@ExceptionHandler来处置惩罚异常:
  1. @RestControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(MethodArgumentNotValidException.class)
  4.     public ResponseEntity<ValidationErrorResponse> handleValidationExceptions(
  5.             MethodArgumentNotValidException ex) {
  6.         ValidationErrorResponse errors = new ValidationErrorResponse();
  7.         ex.getBindingResult().getAllErrors().forEach((error) -> {
  8.             errors.addError(((FieldError) error).getField(), error.getDefaultMessage());
  9.         });
  10.         return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
  11.     }
  12.     // 其它异常处理方法
  13. }
复制代码
优点

7. 总结

本文,我们分析了 Spring MVC优雅处置惩罚异常的几种方法以及代码示例,我们可以根据详细需求选择合适的方法:

从实际工作来看,@ControllerAdvice@RestControllerAdvice是利用频率最高的一种方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4