2012-02-13 1 views
0

私の春のフォームを送信できません。私はこの例外を得ていると、なぜ分からない: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に問題がありますか?

+0

例外は、具体的なデータが要件と一致しないことcompains。 (Hibernateは制約をチェックします(それを設定することができます))保存したいエンティティの具体的なデータは何ですか? – Ralph

+0

私は、デフォルトのグループ '[javax.validation.groups.Default、]'の後ろにseperatorの印が少し心配です。それほどうまく書式化された問題ではないか、または休止状態で実際に名前のない第2のグループを検証しようとするかもしれません。 – Ralph

+0

ところで、パスワード確認のためにhttp://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303を見てください – Ralph

答えて

1

注釈confirmPassword@NotNull注釈をデフォルトの検証グループではないと考えるべきです。

OR-Mapperで@Transientフィールドの検証がバグであるとしても、しかし、JPAやHibernateには別の意見があるかもしれません。 - 問題がその一時的なフィールドに属することを確認でき、私の意見に同意するならば、hibernatesバグトラッカーにティックを投稿するかもしれません。

は、Hibernateは本当に彼らは@Transientでマークされている場合でも、フィールドを検証しているいくつかの奇妙な理由で を追加しました。 https://forum.hibernate.org/viewtopic.php?f=9&t=1009600&start=0

もう1つの考え方は、エンティティを使用してGUIにのみ使用されるフィールドを含むことではありません。したがって、エンティティオブジェクトからフォームデータコンテナ(コマンドオブジェクト)を分離する必要があります。

@see Ignore transient pattern on save hibernate entity

+0

だから私は別のいくつかのJavaコードを追加せずにグループ? – dtrunk

+0

空のインターフェースを追加したくない場合は追加したくありません。 '@NotEmpty(groups = NoDefault.class)' + '公衆インタフェースNoDefault {}'が動作します... – dtrunk

+0

空のインタフェースのように考えるのではなく、マーカのように考えてください;-) http://stackoverflow.com/questions/9257673/conditional-validations-in-spring/9258050#9258050 – Ralph