Spring Boot的@ControllerAdvice的作用与使用方法
@ControllerAdvice
是Spring Boot框架中的一个注解,用于定义全局控制器异常处理器。可以用于捕获控制器中抛出的异常,并进行统一的处理。@ControllerAdvice
注解可以用于类上。
@ControllerAdvice的作用
@ControllerAdvice
注解的作用是定义全局控制器异常处理器,用于捕获控制器中抛出的异常,并进行统一的处理。它可以用于处理控制器中的异常,例如404、500等异常。
@ControllerAdvice的使用方法
在类上使用@ControllerAdvice
注解,可以定义全局控制器异常处理器。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误");
}
}
在上述示例中,使用@ControllerAdvice
注解定义了一个全局控制器异常处理器。使用@ExceptionHandler
注解定义了一个处理Exception类型异常的方法,当控制器中抛出Exception类型异常时,会调用该方法进行处理。在该方法中,返回了一个HTTP状态码为500的响应,并返回了一个错误信息。
下面是另一个@ControllerAdvice
注解的示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getDefaultMessage()).append(",");
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
}
}
在上述示例中,使用@ControllerAdvice
注解定义了一个全局控制器异常处理器。使用@ExceptionHandler
注解定义了一个处理MethodArgumentNotValidException类型异常的方法,当控制器中抛出MethodArgumentNotValidException类型异常时,会调用该方法进行处理。在该方法中,获取了异常中的BindingResult对象,并历其中的FieldError对象,将错误信息拼接成一个字符串返回。返回了一个HTTP状态码为400的响应,并返回了错误信息。
@ControllerAdvice的示例
下面是一个@ControllerAdvice
注解的示例:
@ControllerAdvice
public class GlobalExceptionHandler {
private final UserService userService;
public GlobalExceptionHandler(UserService userService) {
this.userService = userService;
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getDefaultMessage()).append(",");
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
}
}
在上述示例中,使用@ControllerAdvice
注解定义了一个全局控制器异常处理器。使用@ExceptionHandler
注解定义了一个处理UserNotFoundException类型异常的方法和一个处理MethodArgumentNotValidException类型异常的方法。当控制器中抛出UserNotFoundException类型异常时,会调用handleUserNotFoundException方法进行处理;当控制器中抛出MethodArgumentNotValidException类型异常时,会调用handleMethodArgumentNotValidException方法进行处理。在handleUserNotFoundException方法中,返回了一个HTTP状态码为404的响应,并返回了异常信息;在handleMethodArgumentNotValidException方法中,返回了一个HTTP状态码为400的响应,并返回了错误信息。
下面是另一个@ControllerAdvice
注解的示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误");
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getDefaultMessage()).append(",");
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
}
}
在上述示例中,使用@ControllerAdvice
注解定义了一个全局控制器异常处理器。使用@ExceptionHandler
注解定义了一个处理Exception类型异常、一个处理UserNotFoundException类型异常和一个处理MethodArgumentNotValidException类型异常的方法。当控制器中抛出Exception类型异常时,会调用handleException方法进行处理;当控制器中抛出UserNotFoundException类型异常时,会调用handleUserNotFoundException方法进行处理;当控制器中抛出MethodArgumentNotValidException类型异常时,会调用handleMethodArgumentNotValidException方法进行处理。在handleException方法中,返回了一个HTTP状态码为500的响应,并返回了一个错误信息;在handleUserNotFoundException方法中,返回了一个HTTP状态码为404的响应,并返回了异常信息;在handleMethodArgumentNotValidException方法中,返回了一个HTTP状态码为400的响应,并返回了错误信息。
总结
@ControllerAdvice
是Spring Boot框架中的一个注解,用于定义全局控制器异常处理器,用于捕获控制器中抛出的异常,并进行统一的处理。它可以用于处理控制器中的异常,例如404、500等异常。在实际开发中,我们可以根据需要定义多个异常处理方法,以便对不同类型的异常进行不同的处理。