@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个字符,该方法将抛出相应的异常。在这个示例中,我们使用了三种不同的异常类型来演示如何处理不同类型的异常。