Bean Ограничения проверки, нарушенные при выполнении Automatic Bean Проверка на событие обратного вызова: 'prePersist'
Я хотел бы сохранить birthdate
, поэтому я выбрал date
в MySQL, когда я создаю свои сущности, базирующиеся в моей базе данных, получается так:
import java.util.Date;
// ..code
@NotNull(message="fill you birthdate")
@Temporal(TemporalType.DATE)
private Date birthdate;
Но когда я пытаюсь упорствовать, это дает мне эту ошибку:
Bean Ограничения проверки, нарушенные при выполнении Automatic Bean Проверка на событие обратного вызова: 'prePersist'. Пожалуйста, обратитесь к встроенным ConstraintViolations для получения более подробной информации.
Что я здесь делаю неправильно?
Я читал кое-что о том, как определить часовой пояс в Google, я из Бразилии, как мне это сделать?
ИЗМЕНИТЬ
package entity;
import java.io.Serializable;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import java.util.Date;
import java.util.List;
/**
* The persistent class for the user database table.
*
*/
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Temporal(TemporalType.DATE)
private Date birthdate;
@NotNull(message="informe seu e-mail")
@Email(message="e-mail inválido")
private String email;
@NotNull(message="informe seu gênero")
private String gender;
private String image;
@NotNull(message="informe seu nome completo")
private String name;
@Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
@NotNull(message="informe sua senha")
private String password;
//bi-directional many-to-one association to Document
@OneToMany(mappedBy="user")
private List<Document> documents;
//bi-directional many-to-one association to QuestionQuery
@OneToMany(mappedBy="user")
private List<QuestionQuery> questionQueries;
//bi-directional many-to-one association to Team
@OneToMany(mappedBy="user")
private List<Team> teams;
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getBirthdate() {
return this.birthdate;
}
public void setBirthdate(Date birthdate) {
this.birthdate = birthdate;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return this.gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getImage() {
return this.image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Document> getDocuments() {
return this.documents;
}
public void setDocuments(List<Document> documents) {
this.documents = documents;
}
public List<QuestionQuery> getQuestionQueries() {
return this.questionQueries;
}
public void setQuestionQueries(List<QuestionQuery> questionQueries) {
this.questionQueries = questionQueries;
}
public List<Team> getTeams() {
return this.teams;
}
public void setTeams(List<Team> teams) {
this.teams = teams;
}
public void print() {
System.out.println("User [id=" + id + ", birthdate=" + birthdate + ", email="
+ email + ", gender=" + gender + ", image=" + image + ", name="
+ name + ", password=" + password + "]");
}
}
Ответы
Ответ 1
То, что я сделал для решения моей проблемы, состояло в том, чтобы инвертировать порядок @Size
и @NotNull
перед:
@Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
@NotNull(message="informe sua senha")
private String password;
после
@NotNull(message="informe sua senha")
@Size(min=6,max=16, message="senha com no mínimo: 6 dígitos e no máximo 16 dígitos")
private String password;
Я не знаю, почему этот порядок имеет значение, но он делает =]
Спасибо всем!
Ответ 2
У меня такая же проблема, но после долгих поисков ответа, наконец, я нашел... Вы должны отредактировать свой класс AbstractFacade.java и добавить этот код
public void create(T entity) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
if(constraintViolations.size() > 0){
Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
while(iterator.hasNext()){
ConstraintViolation<T> cv = iterator.next();
System.err.println(cv.getRootBeanClass().getName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
}
}else{
getEntityManager().persist(entity);
}
}
Теперь этот метод предупредит вас о том, какое свойство и почему он не прошел проверку.
Надеюсь, это сработает для вас, как и для меня.
Ответ 3
Я получил ярлык, поймаю следующее исключение, где вы сохраняете объект. В моем случае это в методе добавления EJB. где я делаю em.persist()
. Затем проверьте журнал сервера, вы увидите, какой атрибут имеет ограничение на нарушение.
catch (ConstraintViolationException e) {
log.log(Level.SEVERE,"Exception: ");
e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
}
Ответ 4
Ошибка показывает, что объект, который вы пытаетесь сохранить, не работает
базы данных, поэтому попробуйте определить точные значения, которые вы вставляете в базу данных, прежде чем вставлять их.
и попробуйте, комментируя /ommitting @NotNull
аннотацию также.
Ответ 5
Конечно, ответ Iomanip полностью прав! Я только немного расширил его. Возможно, это тоже помогает:
private boolean constraintValidationsDetected(T entity) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
if (constraintViolations.size() > 0) {
Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
while (iterator.hasNext()) {
ConstraintViolation<T> cv = iterator.next();
System.err.println(cv.getRootBeanClass().getName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
}
return true;
}
else {
return false;
}
}
public void create(T entity) {
if (!constraintValidationsDetected(entity)) {
getEntityManager().persist(entity);
}
}
public T edit(T entity) {
if (!constraintValidationsDetected(entity)) {
return getEntityManager().merge(entity);
}
else {
return entity;
}
}
public void remove(T entity) {
if (!constraintValidationsDetected(entity)) {
getEntityManager().remove(getEntityManager().merge(entity));
}
}
Ответ 6
Я потратил несколько часов на борьбу с этой ошибкой, пока я пытался сохранить сущность.
Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.
Это сообщение об ошибке не полезно, довольно запутанно...
В любом случае причина ошибки была - разница между аннотацией в Enity
@Size(min = 1, max = 10)
@Column(name = Utilizator.JPA_DISCRIMINATOR)
private String jpaDiscriminator;
И определение столбца DataBase:
jpaDiscriminator
VARCHAR (15) NOT NULL,
Ответ 7
У меня была аналогичная проблема. В моем случае размеры ссылочных PK и FK отличались (см. Пример).
Сущность A:
some_pk INTEGER NOT NULL,
fk_b VARCHAR2(5 CHAR)
...
fk_b ссылочное поле идентификатора объекта B
Сущность B:
id VARCHAR2(4 CHAR)
...
id был здесь PK.
Обратите внимание на размеры идентификатора (4) и FK_B ( 5). После изменения идентификатора B до 5 CHAR ошибка исчезла.