ConstraintViolationException: пользовательский объект с временным полем confirmPassword

Я не могу отправить свою весеннюю форму. Я получаю это исключение и не знаю почему:

javax.validation.ConstraintViolationException: validation failed for classes [com.example.my.entities.User] during persist time for groups [javax.validation.groups.Default, ]

И вот моя сущность User:

@Entity
@Table( name = "tbl_user" )
public class User implements Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue
  @Column( name = "id", nullable = false, columnDefinition = "serial" )
  private int id;

  @NotEmpty
  @Length( max = 255 )
  @Column( name = "username", unique = true, nullable = false, length = 255 )
  private String username;

  @NotEmpty
  @Column( name = "password", nullable = false, length = 32 )
  private String password;

  @NotEmpty
  @Transient
  private String confirmPassword;

  @NotEmpty
  @Email
  @Length( max = 255 )
  @Column( name = "email", unique = true, nullable = false, length = 255 )
  private String email;

  @Length( max = 255 )
  @Column( name = "role", length = 255 )
  private String role;

  @OneToMany( fetch = FetchType.LAZY, mappedBy = "id.user", cascade = { CascadeType.REMOVE }, orphanRemoval = true )
  private List<LicenseUserAlert> alerts;

  public int getId()
  {
    return id;
  }

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

  public String getUsername()
  {
    return username;
  }

  public void setUsername( String username )
  {
    this.username = username;
  }

  public String getPassword()
  {
    return password;
  }

  public void setPassword( String password )
  {
    this.password = password;
  }

  public String getConfirmPassword()
  {
    return confirmPassword;
  }

  public void setConfirmPassword( String confirmPassword )
  {
    this.confirmPassword = confirmPassword;
  }

  public String getEmail()
  {
    return email;
  }

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

  public String getRole()
  {
    return role;
  }

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

  public List<LicenseUserAlert> getAlerts()
  {
    return alerts;
  }

  public void setAlerts( List<LicenseUserAlert> alerts )
  {
    this.alerts = alerts;
  }
}

Я заполнил форму правильно, поэтому никаких нарушений ограничений быть не должно ... Возможно, что-то не так с confirmPassword?


person dtrunk    schedule 13.02.2012    source источник
comment
Исключение составляет то, что конкретные данные не соответствуют требованиям. (Hibernate также проверит эти константы (вы можете это настроить)) Каковы конкретные данные объекта, который вы хотите сохранить?   -  person Ralph    schedule 14.02.2012
comment
Меня немного беспокоит знак разделителя после группы по умолчанию [javax.validation.groups.Default, ]. Может быть, это только не очень хорошо сделанная проблема с форматированием, или спящий режим действительно пытается проверить вторую группу без имени.   -  person Ralph    schedule 14.02.2012
comment
Кстати: для подтверждения пароля посмотрите stackoverflow.com/questions/1972933/   -  person Ralph    schedule 14.02.2012


Ответы (1)


Вам следует подумать о том, чтобы поместить аннотацию @NotNull для confirmPassword в группу проверки не по умолчанию.

Даже если я верю, что проверка поля @Transient оператором OR-Mapper является ошибкой. Но может быть у JPA или Hibernate другое мнение. - Если вы можете убедиться, что проблема связана с этим временным полем, и согласны с моим мнением, вы можете опубликовать отметку в системе отслеживания ошибок гибернации.

Добавлено. По какой-то странной причине спящий режим действительно проверяет поля, даже если они отмечены @Transient. См. Этот форум https://forum.hibernate.org/viewtopic.php?f=9&t=1009600&start=0

Другая идея - не использовать сущность для содержания поля, которое используется только для графического интерфейса. Так что, возможно, вам следует отделить контейнер данных формы (объект команды) от объектов сущности.

@ См. Игнорировать переходной шаблон при сохранении объекта гибернации

person Ralph    schedule 13.02.2012
comment
Итак, я думаю, что невозможно добавить другую группу без добавления кода Java? - person dtrunk; 14.02.2012
comment
я не хочу добавлять пустой интерфейс, если в этом нет необходимости. но @NotEmpty( groups = NoDefault.class ) + public interface NoDefault{} работает ... - person dtrunk; 14.02.2012
comment
Не думайте об этом как о пустом интерфейсе, думайте о нем как о маркере ;-). См. stackoverflow.com/questions/9257673/ - person Ralph; 14.02.2012
comment
Вау, да, я могу это сделать. Я просто использовал сам объект: @NotEmpty( groups = User.class ) - person dtrunk; 14.02.2012