зарегистрировать пользовательский валидатор гибернации с помощью entitymanager

Я написал пользовательскую аннотацию валидатора и класс валидатора для него. Но когда я вызываю entitymanager.persist(), пользовательская проверка не срабатывает. Чего мне не хватает, чтобы менеджер сущностей запускал мой пользовательский валидатор?

Когда я запускаю свои тесты, я вижу, как встроенные проверки @NotNull и @Size вызываются во время entitymanager.persist(), но мой пользовательский валидатор никогда не вызывается. Как мне это подключить?

Не обращайте слишком много внимания на фактическую проверку, которую я делаю. Я просто пытаюсь подключить его и срабатывать при сохранении.

Вот фрагмент аннотации:


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;
    }
}

Спасибо.


person lostdorje    schedule 14.08.2013    source источник
comment
Вы видите, что ваш валидатор вызывается при ручной проверке экземпляра вашей сущности через Validator#validate()?   -  person Gunnar    schedule 14.08.2013
comment
Хороший вопрос... и нет, я не вижу его, когда вручную вызываю валидатор. Я перешел через код к коду валидатора гибернации (hibernate-validator-4.2.0.Final), и когда я прошел, я увидел метаограничения, собранные в набор (строка 378 org.hibernate.validator.engine.ValidatorImpl. Это было мои поля и их ограничения (нестандартные, например: @NotNull). Но в нем отсутствовало мое пользовательское ограничение @Password. Я не знаю, как заставить спящий режим знать о моем пользовательском ограничении. Я не знаю, что я меня здесь не хватает.   -  person lostdorje    schedule 14.08.2013


Ответы (2)


Вам необходимо указать правильные параметры типа для типа аннотации ограничения и целевого типа данных при реализации ConstraintValidator:

public class PasswordValidator
        implements ConstraintValidator<Password, String> {
    ...
}
person Gunnar    schedule 14.08.2013
comment
о... мой плохой. я не знаю, почему, когда я копировал и вставлял, он терял параметры типа... так что, похоже, это не проблема. я исправил код, который я опубликовал.....ээээ странно...на самом деле исходный пост, который я сделал, верен, но параметры типа не отображаются в отрендеренном выводе ‹pre›‹code›. ??? - person lostdorje; 14.08.2013

Дох! Я провожу свои тесты, используя Arquillian и ShrinkWrap. Я создаю тестовый военный файл для развертывания и запускаю свои тесты. Я забыл добавить новую аннотацию проверки и классы проверки в свой военный файл ShrinkWrap. Вот почему валидации не было жаль.

person lostdorje    schedule 14.08.2013