Sprint Boot @ControllerAdvice使用方法详解

  • Post category:Java

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等异常。在实际开发中,我们可以根据需要定义多个异常处理方法,以便对不同类型的异常进行不同的处理。