SpringMVC基于注解的异常处理(二)

2023-05-14 11:36:37 浏览数 (1)

@ExceptionHandler注解的用法

@ExceptionHandler注解可以应用于控制器类和处理器方法上。如果应用于控制器类上,那么所有的处理器方法都将继承该注解,并使用相同的异常处理器。如果应用于处理器方法上,那么只有该方法才会使用该注解定义的异常处理器。

@ExceptionHandler注解可以接受一个或多个异常类型作为参数,用于指定该异常处理器处理的异常类型。如果没有指定异常类型,那么该异常处理器将处理所有未处理的异常。注解方法可以返回不同类型的结果,如响应实体、视图名称、模型和视图等。

下面是一个使用@ExceptionHandler注解处理多个异常类型的示例代码:

代码语言:javascript复制
@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler({InvalidEmailException.class, InvalidPasswordException.class})
  public ResponseEntity<String> handleInvalidInputException(Exception ex) {
    return ResponseEntity
            .status(HttpStatus.BAD_REQUEST)
            .body(ex.getMessage());
  }

  @ExceptionHandler(UserNotFoundException.class)
  public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
    return ResponseEntity
            .status(HttpStatus.NOT_FOUND)
            .body(ex.getMessage());
  }

  @ExceptionHandler(Exception.class)
  public ResponseEntity<String> handleException(Exception ex) {
    return ResponseEntity
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("An unexpected error occurred.");
  }
}

@Controller
public class UserController {

  @PostMapping("/register")
  public ResponseEntity<String> registerUser(@RequestParam String email, @RequestParam String password) throws InvalidEmailException, InvalidPasswordException {
    if(!isValidEmail(email)) {
      throw new InvalidEmailException("Invalid email address.");
    }
    if(!isValidPassword(password)) {
      throw new InvalidPasswordException("Password must be at least 8 characters long.");
    }
    // 用户注册逻辑
    return ResponseEntity.ok("User registered successfully.");
  }

  private boolean isValidEmail(String email) {
    // 验证电子邮件地址是否有效
    return true;
  }

  private boolean isValidPassword(String password) {
    // 验证密码是否有效
    return password.length() >= 8;
  }

  public static void main(String[] args) {
    SpringApplication.run(UserController.class, args);
  }
}

class InvalidEmailException extends Exception {
  public InvalidEmailException(String message) {
    super(message);
  }
}

class InvalidPasswordException extends Exception {
  public InvalidPasswordException(String message) {
    super(message);
  }
}

class UserNotFoundException extends Exception {
  public UserNotFoundException(String message) {
    super(message);
  }
}

在这个示例中,我们定义了一个GlobalExceptionHandler类,它使用@ControllerAdvice注解标记,表明它是一个全局异常处理器。该类定义了三个异常处理器方法:handleInvalidInputException、handleUserNotFoundException和handleException。这些方法分别处理InvalidEmailException、InvalidPasswordException和UserNotFoundException异常,以及其他所有未处理的异常。异常处理器方法返回一个包含响应状态码和消息的ResponseEntity对象。

我们还定义了一个UserController控制器类,它包含一个名为registerUser的方法,该方法接受email和password两个请求参数。如果email参数不是有效的电子邮件地址或password参数长度小于8个字符,该方法将抛出相应的异常。在这个示例中,我们使用了三种不同的异常类型来演示如何处理不同类型的异常。

0 人点赞