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