使用entitymanager注册自定义hibernate验证器

时间:2013-08-14 04:49:46

标签: hibernate java-ee jpa entitymanager hibernate-validator

我为它编写了自定义验证器注释和验证器类。但是当我调用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;
    }
}

感谢。

2 个答案:

答案 0 :(得分:0)

在实施ConstraintValidator时,您需要为约束注释类型和目标数据类型指定正确的类型参数:

public class PasswordValidator
        implements ConstraintValidator<Password, String> {
    ...
}

答案 1 :(得分:0)

卫生署!我正在使用Arquillian和ShrinkWrap运行我的测试。我创建了一个要部署的测试war文件并运行我的测试。我忘记将新的验证注释和验证器类添加到ShrinkWrap war文件中。这就是为什么验证不是抱歉。