在回调事件上执行自动 Bean 验证时违反 Bean 验证约束:"prePersist"



我想存储birthdate所以我选择了 MySQL date,当我基于我的数据库创建实体时,结果是这样的:

import java.util.Date;
    // ..code
    @NotNull(message="fill you birthdate")
    @Temporal(TemporalType.DATE)
    private Date birthdate;

但是当我尝试坚持时,它会给我这个错误:

回调事件"prePersist"上执行自动 Bean 验证时违反了 Bean 验证约束。有关详细信息,请参阅嵌入式约束冲突。

我在这里做错了什么?我正在阅读有关在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 + "]");
    }

}

我遇到了同样的问题,但经过几个小时寻找答案,终于找到了......您应该编辑 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);
    }
}

现在,此方法将提醒您哪个属性以及验证失败的原因。我希望这对你有用,就像对我一样。

我得到了一个捷径,在你保留实体的地方捕获以下异常。在我的例子中,它在 EJB 添加方法中。我在哪里做em.persist().然后检查服务器日志,您将看到哪个属性具有约束冲突。

catch (ConstraintViolationException e) {
       log.log(Level.SEVERE,"Exception: ");
       e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
    }

该错误显示您尝试保留的实体失败数据库约束,因此请尝试在实际插入之前确定要插入到数据库中的确切值。

并尝试通过注释/省略@NotNull注释。

我为解决问题所做的是颠倒顺序@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;

我不知道为什么这个顺序如此重要,但它确实=]谢谢大家!

当然,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));
    }
  }
我在

尝试保留实体时花了几个小时与此错误作斗争。

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;

和数据库列定义:

jpaDiscriminator 瓦尔查尔(15) 不为空,

我有类似的问题。在我的情况下,引用的PK和FK的大小不同(参见示例)。

实体 A:

some_pk   INTEGER NOT NULL,
fk_b      VARCHAR2(5 CHAR)
...

fk_b实体 B 的引用 ID 字段

实体 B:

id VARCHAR2(4 CHAR)
...

id在这里是一个PK。

请注意 ID(4) 和 FK_B(5) 的大小。将 B 的 ID 更改为 5 CHAR 后,错误已消失。

最新更新