Hibernate ClassValidator getInvalidValues не выдает ошибок

#hibernate #spring #spring-mvc #hibernate-validator

#спящий режим #spring #spring-mvc #спящий режим-валидатор

Вопрос:

Следующий код не выдает никаких недопустимых значений, даже если я заполняю модель недопустимыми значениями.

 private static ClassValidator<User> userValidator = new ClassValidator<User>(User.class);
InvalidValue[] errors = userValidator.getInvalidValues(user);
List<String> err = new ArrayList<String>();
for (InvalidValue invalidValue : errors) {
    System.out.println(invalidValue.getMessage());
}
 

Добавление пользовательского класса объектов в соответствии с запросом в комментариях.

 @Entity(name = "User")
@NamedQueries({
        @NamedQuery(name = MWQueries.nqAllUsers, query = "from User"),
        @NamedQuery(name = MWQueries.nqUserById, query = "from User where id = ?")
})
public class User implements Serializable {

    private static final long serialVersionUID = -5013553611664469461L;

    private Long id;
    private String userName;
    private String email;
    private Role role;
    private @XStreamOmitField String passWord;


    public User() {
    }


    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }


    @Column
    @Length(min = 6, max = 20)
    @NotBlank
    @NotEmpty
    public String getUserName() {
        return userName;
    }


    public void setUserName(String userName) {
        this.userName = userName;
    }


    @Column
    @Length(min = 6)
    @NotBlank
    @NotEmpty
    @JsonIgnore
    public String getPassWord() {
        return passWord;
    }


    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }


    @Column
    public Role getRole() {
        return role;
    }


    public void setRole(Role role) {
        this.role = role;
    }


    @Column(unique = true)
    @Email
    @NotBlank
    @NotEmpty
    public String getEmail() {
        return email;
    }


    public void setEmail(String email) {
        this.email = email;
    }
}
 

Комментарии:

1. Я предполагаю, что строка: «List<String> err = new ArrayList<String>();» должна быть удалена, потому что она ничего не делает. — Но на самом деле я считаю, что проблема где-то в другом, попробуйте сначала проверить, что ClassValidator.hasValidationRules() возвращает true.

2. Это не так. Возвращает false . Что я могу сделать, чтобы это исправить?

3. @Y Kamesh Rao: пожалуйста, опубликуйте класс пользователя.

4. @Ralph Я обновил сообщение, включив класс User в соответствии с вашими требованиями.

5. @Y Kamesh: Я не вижу ничего плохого, вы когда-нибудь пытались переместить все аннотации в поля. (Я не хочу заменять его в производстве, это просто тест)

Ответ №1:

Единственный совет, который я могу вам дать, это попробовать немного по-другому. Если эта проверка теста работает, проблема заключается в том, как вы используете средство проверки. Если это не работает, значит, проблема где-то в вашей сущности

 import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;


/** given: an invalid object */
    Demo invalid = new Demo("Hallo Welt");

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    /** then there must not be constraint violation */
    Set<ConstraintViolation<Demo>> result = validator.validate(invalid);
 

Комментарии:

1. В любом случае спасибо. Но он не проверяет наличие повторяющихся записей. Мне нужно дождаться вставки, чтобы проверить это нарушение ограничения.

2. Y Камеш Рао: это выполняет только проверку JSR303. Я не видел никаких ограничений на дублирование проверки. В любом случае, если вы говорите о препятствующем ограничении, то это выполняется с базой данных, поэтому это ограничение не будет проверяться до тех пор, пока объект не будет сохранен и транзакция не будет зафиксирована.

Ответ №2:

Вызов кода средства проверки состояния гибернации на уровне приложения после проверки ограничений javax проверяет проверки состояния гибернации.

 public Validity validate(T bean, Class<T> beanClass) {
    List<String> err = new ArrayList<String>();
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    javax.validation.Validator validator = validatorFactory.getValidator();

    Set<ConstraintViolation<T>> violations = validator.validate(bean);
    for (ConstraintViolation<T> violation : violations) {
        String propertyPath = violation.getPropertyPath().toString().toLowerCase();
        String message = violation.getMessage();
        String errMsg = WordUtils.capitalize(propertyPath)   " "   message;

        Log.error(EntityValidator.class, "Invalid Value: '"   errMsg);
        err.add(errMsg);
    }

    // Checking for hibernate validations
    err.addAll(hValidate(bean, beanClass));

    return new Validity(err.isEmpty(), err);
}


public List<String> hValidate(T bean, Class<T> beanClass) {
    List<String> err = new ArrayList<String>();
    ClassValidator<T> hValidator = new ClassValidator<T>(beanClass);

    InvalidValue[] hErrs = hValidator.getInvalidValues(bean);

    for (InvalidValue invalidValue : hErrs) {
        err.add(invalidValue.getMessage());
        Log.error(EntityValidator.class, "Invalid Value: '"   invalidValue.getMessage());
    }

    return err;
}