gpt4 book ai didi

java - @ExceptionHandler 没有捕获 MethodArgumentNotValidException

转载 作者:行者123 更新时间:2023-11-30 02:02:02 26 4
gpt4 key购买 nike

我有以下@ControllerAdvice:

@ControllerAdvice
public class ExceptionHandlingController {

@ExceptionHandler(value = { MethodArgumentNotValidException.class,
EntityExistsException.class, BadCredentialsException.class, MismatchedInputException.class })
public ResponseEntity<ExceptionResponse> invalidInput(RuntimeException ex) {
ExceptionResponse response = new ExceptionResponse();
response.setErrorCode("BAD_REQUEST");
response.setErrorMessage(ex.getMessage());
return new ResponseEntity<ExceptionResponse>(response,
HttpStatus.BAD_REQUEST);
}

}

validator 以这种方式绑定(bind)到 Controller :

@RestController
@RequestMapping("/api/authentication")
public class UserAccountControllerImpl implements UserAccountController {

@Autowired
private UserAccountService userAccountService;

@Override
public UserAccountEntity login(@Valid @RequestBody UserAccountEntity account,
HttpServletResponse response) throws BadCredentialsException {
return userAccountService.authenticateUserAndSetResponsenHeader(
account.getUsername(), account.getPassword(), response);
}

@Override
public UserAccountEntity create(@Valid @RequestBody UserAccountEntity userAccount,
HttpServletResponse response) throws EntityExistsException {
String username = userAccount.getUsername();
String password = userAccount.getPassword();
userAccountService.saveIfNotExists(username, password);
return userAccountService.authenticateUserAndSetResponsenHeader(
username, password, response);
}

//used to bind the validator to the incoming request
@InitBinder
public void binder(WebDataBinder binder) {
binder.addValidators(new UserAccountValidator());
}
}

这是用于验证传入的 UserAccountEntityUserAccountValidator:

public class UserAccountValidator implements Validator {

@Override
public boolean supports(Class<?> clazz) {
return UserAccountEntity.class.equals(clazz);
}

@Override
public void validate(Object target, Errors errors) {
UserAccountEntity userAccount = (UserAccountEntity) target;
String password = userAccount.getPassword();
String username = userAccount.getUsername();
EmailValidator emailValidator = EmailValidator.getInstance();
if (!emailValidator.isValid(username)) {
errors.reject("Username must be a valid email address");
}
if (password.length() > 30 || password.length() < 8) {
errors.reject("Password must be at least 8 and at most 30 characters");
}
if (!Pattern.compile( "[0-9]" ).matcher(password).find()) { // it doesn't contain any digit
errors.reject("Password must have at least one digit");
}
if (password.toUpperCase().equals(password)) { //it's all upper-case
errors.reject("Password must have at least one lower case character");
}
if (password.toLowerCase().equals(password)) { //it's all lower-case
errors.reject("Password must have at least one upper case character");
}
}
}

当我传入无效的密码/用户名时,出现以下错误:

java.lang.IllegalStateException: Could not resolve method parameter at index 0 in public org.springframework.http.ResponseEntity<com.myproject.project.core.controller.ExceptionResponse> com.myproject.project.core.controller.ExceptionHandlingController.invalidInput(java.lang.RuntimeException): No suitable resolver for argument 0 of type 'java.lang.RuntimeException'
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:175) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]

为什么它没有捕获MethodArgumentNotValidException

最佳答案

至少,异常 MethodArgumentNotValidException 不是 RuntimeException,但您在该异常处理程序中使用 RuntimeException 参数。为了测试,将方法参数中的 RuntimeException 更改为 Exception。

关于java - @ExceptionHandler 没有捕获 MethodArgumentNotValidException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52543904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com