@ControllerAdvice 与 @ResponseStatus 一起进行异常处理

spring

1个回答

写回答

zt412832

2025-07-09 16:47

+ 关注

Spring
Spring

在开发过程中,我们常常会遇到各种异常情况,如网络请求失败、参数校验错误、数据库操作异常等。为了能够更好地处理这些异常情况并向用户提供友好的提示信息,我们可以使用 Spring 框架提供的 @ControllerAdvice 和 @ResponseStatus 注解进行统一的异常处理。

使用 @ControllerAdvice 统一处理异常

@ControllerAdvice 是一个用来处理全局异常的注解,通过在类上添加该注解,我们可以定义全局的异常处理逻辑。在这个类中,我们可以定义多个方法,每个方法用来处理不同类型的异常。

首先,我们创建一个全局异常处理类 GlobalExceptionHandler,并在类上添加 @ControllerAdvice 注解:

Java

@ControllerAdvice

public class GlobalExceptionHandler {

}

接下来,我们可以在 GlobalExceptionHandler 中添加一些异常处理方法。我们可以使用 @ExceptionHandler 注解来指定需要处理的异常类型。

例如,我们可以添加一个方法来处理 IllegalArgumentException 异常:

Java

@ExceptionHandler(IllegalArgumentException.class)

public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {

return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);

}

在上述代码中,我们使用 @ExceptionHandler(IllegalArgumentException.class) 注解来指定需要处理的异常类型为 IllegalArgumentException。当出现该异常时,框架会自动调用 handleIllegalArgumentException 方法,并将异常对象作为参数传入。在方法中,我们可以根据异常对象来进行一些自定义的处理逻辑,然后返回一个 ResponseEntity 对象,用于返回给客户端。

使用 @ResponseStatus 定义异常的 HTTP 状态码

在处理异常时,除了返回异常信息外,我们还可以通过 @ResponseStatus 注解来指定异常对应的 HTTP 状态码。这样,当发生异常时,框架会自动返回指定的状态码给客户端。

我们可以在异常处理方法上添加 @ResponseStatus 注解,并指定对应的状态码。例如,我们可以将上面的 handleIllegalArgumentException 方法修改如下:

Java

@ExceptionHandler(IllegalArgumentException.class)

@ResponseStatus(HttpStatus.BAD_REQUEST)

public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {

return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);

}

在上述代码中,我们添加了 @ResponseStatus(HttpStatus.BAD_REQUEST) 注解,指定了当发生 IllegalArgumentException 异常时,返回的状态码为 400 Bad Request。

案例代码

下面是一个完整的示例,演示了如何使用 @ControllerAdvice 和 @ResponseStatus 进行异常处理:

Java

@ControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(IllegalArgumentException.class)

@ResponseStatus(HttpStatus.BAD_REQUEST)

public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {

return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);

}

@ExceptionHandler(NullPointerException.class)

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)

public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {

return new ResponseEntity<>("发生空指针异常", HttpStatus.INTERNAL_SERVER_ERROR);

}

}

在上述代码中,我们定义了两个异常处理方法。handleIllegalArgumentException 方法用于处理 IllegalArgumentException 异常,返回的状态码为 400 Bad Request;handleNullPointerException 方法用于处理 NullPointerException 异常,返回的状态码为 500 Internal Server Error。

使用 @ControllerAdvice 和 @ResponseStatus 可以方便地统一处理异常,并向用户提供友好的提示信息。通过指定异常类型和返回的状态码,我们可以根据具体的业务需求进行自定义的异常处理。这样,我们就能够更好地应对各种异常情况,提升用户体验和系统的稳定性。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号