HV000028:isValid 调用期间发生意外异常
HV000028: Unexpected exception during isValid call
我创建了自定义验证规则来检查数据库中是否存在用户名。
我的用户 class 有一个用户名,该用户名有一个自定义验证规则,当创建一个对象时,它会在数据库中检查是否存在相同的用户名。
我使用 interface UserRepository extends JpaRepository<User, Integer>
将用户保存到数据库中,并在自定义验证规则中检查用户名是否已存在。我利用
@Autowired
UserRepository userRepository;
我可以单独验证用户并将它们保存到数据库中,但是当像调用 userRepository.save(user);
一样使用它们时,自定义验证规则中的 @Autowired UserRepository userRepository;
不会启动,因此它仍然为空。
javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
自定义验证规则
public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
@Autowired
UserRepository userRepository;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !userRepository.existsUserByUsername(s);
}
}
正在尝试在控制器中保存用户
@PostMapping("/save")
public String save(@Valid @ModelAttribute("user") User user,BindingResult result, @RequestParam String password2){
if(result.hasErrors()) return "register";
userRepository.save(user);
return "login";
}
这是完整的堆栈跟踪:https://justpaste.it/7rnx7
-
您的自定义验证 class 似乎不是 Spring 托管 bean。尝试向其添加 @Component
注释,如下所示:
@Component
public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
@Autowired
UserRepository userRepository;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !userRepository.existsUserByUsername(s);
}
}
更新 2021 年 6 月 9 日
看起来(根据 )你还需要设置一个 LocalValidatorFactoryBean
来让它工作:
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
在application.propperties
中添加spring.jpa.properties.javax.persistence.validation.mode=none
我在这个帖子中找到了答案:Spring-Boot How to properly inject javax.validation.Validator
This 答案包括我在使用 bean 验证和休眠时遇到的问题的解决方案。
"...因为 Hibernate 不知道 Spring 上下文,据我所知,没有办法告诉它,即使是 LocalValidatorFactoryBean。这导致验证器 运行 两次。一次正确,一次失败。"
简而言之,解决方案是通过在 application.propperties
中添加以下行来告诉休眠不 运行 验证
spring.jpa.properties.javax.persistence.validation.mode=none
我建议您阅读此问题的完整答案,以便更好地理解它对 LocalValidatorFactoryBean.
的影响
感谢 João Dias 帮助我找到这个答案。
我创建了自定义验证规则来检查数据库中是否存在用户名。
我的用户 class 有一个用户名,该用户名有一个自定义验证规则,当创建一个对象时,它会在数据库中检查是否存在相同的用户名。
我使用 interface UserRepository extends JpaRepository<User, Integer>
将用户保存到数据库中,并在自定义验证规则中检查用户名是否已存在。我利用
@Autowired
UserRepository userRepository;
我可以单独验证用户并将它们保存到数据库中,但是当像调用 userRepository.save(user);
一样使用它们时,自定义验证规则中的 @Autowired UserRepository userRepository;
不会启动,因此它仍然为空。
javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
自定义验证规则
public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
@Autowired
UserRepository userRepository;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !userRepository.existsUserByUsername(s);
}
}
正在尝试在控制器中保存用户
@PostMapping("/save")
public String save(@Valid @ModelAttribute("user") User user,BindingResult result, @RequestParam String password2){
if(result.hasErrors()) return "register";
userRepository.save(user);
return "login";
}
这是完整的堆栈跟踪:https://justpaste.it/7rnx7
您的自定义验证 class 似乎不是 Spring 托管 bean。尝试向其添加 @Component
注释,如下所示:
@Component
public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
@Autowired
UserRepository userRepository;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !userRepository.existsUserByUsername(s);
}
}
更新 2021 年 6 月 9 日
看起来(根据 )你还需要设置一个 LocalValidatorFactoryBean
来让它工作:
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
在application.propperties
中添加spring.jpa.properties.javax.persistence.validation.mode=none
我在这个帖子中找到了答案:Spring-Boot How to properly inject javax.validation.Validator
This 答案包括我在使用 bean 验证和休眠时遇到的问题的解决方案。
"...因为 Hibernate 不知道 Spring 上下文,据我所知,没有办法告诉它,即使是 LocalValidatorFactoryBean。这导致验证器 运行 两次。一次正确,一次失败。"
简而言之,解决方案是通过在 application.propperties
中添加以下行来告诉休眠不 运行 验证spring.jpa.properties.javax.persistence.validation.mode=none
我建议您阅读此问题的完整答案,以便更好地理解它对 LocalValidatorFactoryBean.
的影响感谢 João Dias 帮助我找到这个答案。