- @RestControllerAdvice是一个注解,用于定义一个全局的异常处理器,它可以在应用程序中捕获所有控制器抛出的异常,并返回适当的HTTP响应。在Spring应用程序中处理异常,可以使用@ControllerAdvice注解。但如果应用程序是RESTful风格的,则建议使用@RestControllerAdvice注解。它和@ControllerAdvice注解非常相似,但它返回的是JSON格式的数据,而不是HTML。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {NullPointerException.class})
public ResponseEntity<?> handleNullPointerException(Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Null pointer exception occurred");
}
@ExceptionHandler(value = {IllegalArgumentException.class})
public ResponseEntity<?> handleIllegalArgumentException(Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Illegal argument exception occurred");
}
// other exception handler methods
}
GlobalExceptionHandler类使用@RestControllerAdvice注解进行注释,并定义了两个异常处理方法。
@ExceptionHandler注解用于指定处理的异常类型,当指定的异常类型抛出时,Spring将调用相应的异常处理方法。在这个例子中,如果发生NullPointerException或IllegalArgumentException异常,将返回一个HTTP 400错误响应,包含相应的错误消息。
总之,@RestControllerAdvice注解可以在Spring应用程序中捕获和处理异常,并返回适当的HTTP响应。
上述代码详解:
- ResponseEntity<?>是Spring框架中的一个类,它代表了HTTP响应实体,包含了响应状态码、响应头和响应正文等信息。ResponseEntity<?>的泛型参数表示响应正文的类型,可以是任何Java类型,包括自定义类型。通常情况下,响应正文是一个字符串、JSON对象或二进制数据等。
使用ResponseEntity<?>的示例:
@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found with id: " + id));
return ResponseEntity.ok(user);
}
getUserById方法返回一个ResponseEntity<User>对象,其中User是一个自定义的实体类。如果查找到用户,将返回一个HTTP 200响应,包含用户对象的JSON表示。如果未找到用户,则将抛出ResourceNotFoundException异常,并返回一个HTTP 404响应,包含错误消息。
- ResponseEntity<?>类还有其他一些有用的方法,例如:
- status(HttpStatus status):设置HTTP响应状态码。
- headers(HttpHeaders headers):设置HTTP响应头。
- body(T body):设置HTTP响应正文。