我已经为它编写了一个自定义验证器注释和一个验证器类。但是当我调用 entitymanager.persist() 时,不会触发自定义验证。为了让 entitymanager 触发我的自定义验证器,我缺少什么?
当我运行我的测试时,我可以看到在 entitymanager.persist() 期间调用了 @NotNull 和 @Size 内置验证,但我的自定义验证器从未被调用。我该如何连接?
不要太注意我正在做的实际验证。我只是想把它连接起来并触发持久化。
这是注释的片段:
import mypackage.validation.PasswordValidator;
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
@Documented
public @interface Password {
String message() default "{Invalid password}";
Class[] groups() default {};
Class[] payload() default {};
}
这是验证器的片段版本:
package mypackage.validation;
import mypackage.annotation.Password;
public class PasswordValidator implements ConstraintValidator<Password, String> {
@Override
public void initialize(Password passwordAnnotation) {
// TODO noop for now
}
@Override
public boolean isValid(String password, ConstraintValidatorContext context) {
if (StringUtils.isEmpty(password)) {
return false;
}
return true;
}
}
这是我注释的一个简单类的片段:
import mypackage.validation.annotation.Password;
@GeneratePojoBuilder
@Entity
@Table(name = "users", catalog = "mycatalog")
public class User extends DatabaseEntity implements Serializable {
private static final long serialVersionUID = 58608923641104636L;
@Column(unique = true)
@Size(max = 128)
@NotNull
private String email;
// use @Column(length =...) instead of @Size here because password
// length will change after salting and hashing
@Column(length = 102)
@Password
@NotNull
private String password;
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
谢谢。