ove*_*ted 2 spring dependency-injection spring-data-jpa
我创建了一个自定义验证规则来检查数据库中是否存在用户名。
我的 User 类有一个用户名,该用户名具有自定义验证规则,当创建对象时,它会在数据库中检查是否存在相同的用户名。
我使用 aninterface UserRepository extends JpaRepository<User, Integer>将用户保存到数据库中,并在自定义验证规则中检查用户名是否已存在。我利用
@Autowired
UserRepository userRepository;
Run Code Online (Sandbox Code Playgroud)
我可以单独验证用户并将其保存到数据库中,但是当一起使用它们时(例如在自定义验证规则中调用),userRepository.save(user);不会@Autowired UserRepository userRepository;启动,因此它保持为空。
javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
Run Code Online (Sandbox Code Playgroud)
自定义验证规则
public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
@Autowired
UserRepository userRepository;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !userRepository.existsUserByUsername(s);
}
}
Run Code Online (Sandbox Code Playgroud)
尝试将用户保存在控制器中
@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";
}
Run Code Online (Sandbox Code Playgroud)
这是完整的堆栈跟踪:https ://justpaste.it/7rnx7
这是完整的项目: https: //github.com/leotrimvojvoda/todo
spring.jpa.properties.javax.persistence.validation.mode=none在application.properties中添加
我在此线程中找到了答案:Spring-Boot 如何正确注入 javax.validation.Validator
\n这个答案包括我在 bean 验证和休眠方面遇到的问题的解决方案。
\n“...因为 Hibernate 不知道 Spring Context,据我所知,没有办法告诉它,即使使用 LocalValidatorFactoryBean 也不行。这会导致 Validator 运行两次。一次正确,一旦失败。”
\n简而言之,解决方案是通过在application.properties中添加以下行来告诉 hibernate 不要运行验证
\nspring.jpa.properties.javax.persistence.validation.mode=none\nRun Code Online (Sandbox Code Playgroud)\n我建议您阅读这个问题的完整答案,以更好地理解它对LocalValidatorFactoryBean的影响。
\n感谢Jo\xc3\xa3o Dias帮助我找到了这个答案。
\n| 归档时间: |
|
| 查看次数: |
7429 次 |
| 最近记录: |