Spring Boot集中异常处理方法实例
在Spring Boot应用程序中,异常处理是非常重要的一个方面,我们必须合理选择一种异常机制来优雅地处理系统中的所有异常情况。本文介绍了如何通过集中的异常处理来优雅地处理Spring Boot中的所有异常情况。具体来说,我们将使用@ControllerAdvice,@ExceptionHandler和自定义异常来实现。
@ControllerAdvice
@ControllerAdvice注释是一个特定类型的@component用于定义全局控制器的异常处理程序。它是一种方便的方法,用于将@ExceptionHandler方法应用于整个控制器中的许多控制器类。
@ControllerAdvice注释被用作增强控制器。 在Spring MVC中,控制器通常有方法处理HTTP请求。 这些@ExceptionHandler方法处理在控制器执行过程中发生的异常。
@ExceptionHandler
@ExceptionHandler注释是一种Spring框架提供的注释,用于指示特定方法能够处理抛出异常的方法。 它允许我们定义一个返回类型,它告诉Spring应该向客户端发送什么响应。
自定义异常类
Spring集中处理异常的另一种机制是创建自定义异常。创建自定义异常是为了再需要它的时候使用。
-
创建一个自定义异常类
```java
public class CustomException extends RuntimeException {private static final long serialVersionUID = 1L; private String errorMessage; public CustomException(String errorMessage) { this.errorMessage = errorMessage; } public String getErrorMessage() { return errorMessage; }
}
``` -
创建异常处理程序
```java
@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(CustomException.class)
public ResponseEntitycustomExceptionHandler(CustomException ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
errorResponse.setMessage(ex.getErrorMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}@ExceptionHandler(Exception.class)
public ResponseEntityexceptionHandler(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorCode(HttpStatus.BAD_REQUEST.value());
errorResponse.setMessage(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
}
```
示例说明
-
使用@ControllerAdvice和@ExceptionHandler处理IllegalArgumentException
```java
@RestController
public class MyController {@GetMapping("/test1") public String test1() { throw new IllegalArgumentException("Some input parameter is invalid"); }
}
``````java
@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<ErrorResponse> illegalArgumentExceptionHandler(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setErrorCode(HttpStatus.BAD_REQUEST.value()); errorResponse.setMessage(ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST); } @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value()); errorResponse.setMessage(ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); }
}
``` -
使用自定义异常类处理CustomException
```java
@RestController
public class MyController {@GetMapping("/test2") public String test2() { throw new CustomException("Some internal error occurred"); }
}
``````java
public class CustomException extends RuntimeException {private static final long serialVersionUID = 1L; private String errorMessage; public CustomException(String errorMessage) { this.errorMessage = errorMessage; } public String getErrorMessage() { return errorMessage; }
}
``````java
@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(CustomException.class) public ResponseEntity<ErrorResponse> customExceptionHandler(CustomException ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value()); errorResponse.setMessage(ex.getErrorMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setErrorCode(HttpStatus.BAD_REQUEST.value()); errorResponse.setMessage(ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST); }
}
```
使用上述技术,我们可以非常优雅地处理Spring Boot应用程序中的所有异常情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot集中异常处理方法实例 - Python技术站