我为它编写了自定义验证器注释和验证器类。但是当我调用entitymanager.persist()时,自定义验证不会触发。让实体管理员触发我的自定义验证器,我错过了什么?
当我运行测试时,我可以看到在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;
}
}
感谢。
答案 0 :(得分:0)
在实施ConstraintValidator
时,您需要为约束注释类型和目标数据类型指定正确的类型参数:
public class PasswordValidator
implements ConstraintValidator<Password, String> {
...
}
答案 1 :(得分:0)
卫生署!我正在使用Arquillian和ShrinkWrap运行我的测试。我创建了一个要部署的测试war文件并运行我的测试。我忘记将新的验证注释和验证器类添加到ShrinkWrap war文件中。这就是为什么验证不是抱歉。