0

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

谢谢。

4

2 回答 2

0

实现时需要为约束注解类型和目标数据类型指定正确的类型参数ConstraintValidator

public class PasswordValidator
        implements ConstraintValidator<Password, String> {
    ...
}
于 2013-08-14T06:26:43.420 回答
0

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

于 2013-08-14T10:39:50.537 回答