六个Spring Boot处理异常的小技巧


六个Spring Boot处理异常的小技巧

文章插图
在Spring框架中,@ControllerAdvice是全局异常处理机制,用于集中处理应用程序中发生的异常 。
当任何控制器方法(例如REST端点)抛出异常时,该异常会被@ControllerAdvice注解的类捕获 。
@ControllerAdvice类中的@ExceptionHandler方法用于处理特定类型的异常 , 并返回适当的响应 。
六个Spring Boot处理异常的小技巧

文章插图
本文我们通过一个实际场景的例子来详细说明,在Spring Boot应用程序中处理产品相关的自定义异常并进行全局处理的情况 。
步骤:
1. 创建自定义的ProductNotFoundException:在这一步中,我们创建一个自定义异常类ProductNotFoundException,它继承自RuntimeException 。这个自定义异常用于表示系统中找不到产品的情况 。通过创建自定义异常,我们可以提供更具体的错误信息 。
public class ProductNotFoundException extends RuntimeException { public ProductNotFoundException(Long productId) { super(“Product not found with ID: “ + productId); }}解释:
  • 自定义异常用于捕获应用程序特定的错误场景 。
  • 在这种情况下,我们在异常消息中包含了productId,以提供有关缺失产品的详细信息 。
2. 创建产品服务(Product Service):在这步 , 我们创建一个ProductService类 , 负责获取产品信息 。如果找不到产品,会抛出ProductNotFoundException 。
@Servicepublic class ProductService {public Product getProductById(Long productId) {// 模拟获取产品的逻辑Product product = getProductFromDatabase(productId);if (product == null) {throw new ProductNotFoundException(productId);}return product;}// 模拟从数据库获取产品的方法private Product getProductFromDatabase(Long productId) {// 在这里实现您的数据库逻辑// 如果找不到产品,则返回nullreturn null;}}解释:
  • ProductService封装了与产品相关的业务逻辑 。
  • getProductById方法模拟从数据库或其他数据源获取产品 。
  • 如果找不到产品(基于模拟),会抛出ProductNotFoundException 。
3. 创建全局异常处理器(Global Exception Handler):【六个Spring Boot处理异常的小技巧】这一步涉及使用@ControllerAdvice创建一个全局异常处理器 。该处理器负责全局捕获ProductNotFoundException , 并返回自定义错误响应 。
@ControllerAdvicepublic class GlobalExceptionHandler {@ExceptionHandler(ProductNotFoundException.class)public ResponseEntity<ErrorResponse> handleProductNotFoundException(ProductNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);}}解释:
  • @ControllerAdvice将该类标记为全局异常处理器,使其能够处理来自多个控制器的异常 。
  • 处理器内的@ExceptionHandler方法捕获ProductNotFoundException 。
  • 它使用异常中的自定义错误消息构建一个包含404 Not Found状态码的ErrorResponse对象 。
  • 处理器返回包含错误详细信息的JSON响应 。
4. 创建自定义错误响应类(Custom Error Response Class):我们定义一个自定义的错误响应类ErrorResponse,以便在应用程序中统一结构化错误消息 。
public class ErrorResponse {private int statusCode;private String message;public ErrorResponse(int statusCode, String message) {this.statusCode = statusCode;this.message = message;}// Getter方法}解释:
  • ErrorResponse类提供了一个标准化的错误响应格式 。
  • 它包含HTTP状态码和描述错误的消息字段 。
5. 产品控制器(Controller):在这一步中,我们创建一个控制器ProductController,负责处理根据产品ID获取产品的请求 。
@RestController@RequestMApping("/api/products")public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("/{productId}")public ResponseEntity<Product> getProduct(@PathVariable Long productId) {Product product = productService.getProductById(productId);return ResponseEntity.ok(product);}}解释: