我正在使用Spring MVC创建一个网站,并且我正在使用Spring Data JPA和Hibernate 4作为我的JPA提供程序.目前正在使用Hibernate Validator处理验证.我有一个问题,我的验证器被调用两次,我无法弄清楚为什么.这是一个问题的主要原因是因为第二轮,依赖关系没有自动连接到验证器,我得到一个空指针异常.以下是导致失败的呼叫序列:
任何人都可以阐明验证器被调用两次的原因,特别是为什么要跨越'userRepository.save(user);' 回到这些验证器?
非常感谢
这是我的user.java类
package com.dating.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.joda.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;
import com.dating.annotation.NotDefaultSelect;
import com.dating.annotation.UniqueUsername;
@Entity
@Table(name = "dating.user")
public class User {
@Id
@Column(name = "id")
@GeneratedValue(strategy …
Run Code Online (Sandbox Code Playgroud) 当我使用BindingResult
同@Validated
一个方法的注释,验证无法正常工作。如果我BindingResult
从方法参数中删除,它工作正常。我用过@ControllerAdvice
。
知道为什么它不起作用吗?
我的代码如下:
public ResponseEntity<?> dologin(
@Validated({ Group.Login.class }) @RequestBody User user,
BindingResult errors)
{
// somecode
}
Run Code Online (Sandbox Code Playgroud)
根据验证、数据绑定和类型转换文档,任何验证消息都将自动添加到绑定器的BindingResult
.
去掉不会有影响吧?
我创建了一个自定义验证规则来检查数据库中是否存在用户名。
我的 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