javax.validation.ConstraintViolationException:グループの持続時間中にクラスの検証に失敗しました[javax.validation.groups.Default、]

私のエンティティは name フィールドにBean検証アノテーション @NotBlank @Size を持っています。しかし、 name フィールドを空白のままにしてJSFフォームを送信すると、フィールドの検証は行われません。

問題のフィールドは次のとおりです。

@NotBlank(message = "{name.required}")
@Size(max = 25, message = "{long.value}")
@Column(name = "name", length = 25, nullable = false)
private String name;

データを入力せずにフォームを送信すると、次の例外が発生します。

Caused by: javax.faces.el.EvaluationException: javax.validation.ConstraintViolationException: validation failed for classes [com.myapp.domain.Department] during persist time for groups [javax.validation.groups.Default, ]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 89 more
Caused by: javax.validation.ConstraintViolationException: validation failed for classes [com.myapp.domain.Department] during persist time for groups [javax.validation.groups.Default, ]
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:132)
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:71)
    at org.hibernate.action.EntityInsertAction.preInsert(EntityInsertAction.java:177)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:72)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy212.addDepartment(Unknown Source)
    at com.myapp.beans.DepartmentBean.addOrUpdateDepartment(DepartmentBean.java:105)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)

どのようにこれが引き起こされ、今私はそれを解決することができますか?


Update: here's the relevant part of the view:

         
    
        Department Name:
        
        
            


    
        
    

1

1 答え

スタックトレースから:

at com.myapp.beans.DepartmentBean.addOrUpdateDepartment(DepartmentBean.java:105)
...
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)

This means that your JSF bean action method is invoked anyway while this should have been blocked by the validation constraints on the empty name field and you should have seen a validation error in a or of the form.

これはコマンドボタン/リンクに immeditate = "true" を追加しただけで、この属性を持たないすべての入力コンポーネントがフォーム処理でスキップされることを意味します。


空のフィールドの検証をスキップする web.xml にこのコンテキストパラメータがあることを確認してください:


    javax.faces.VALIDATE_EMPTY_FIELDS
    false

または次のタグでビュー内のBean検証を無効にしたことを確認します。


あなたはそれらのどれも持っていないことを確認してください。


Update: as per your update, you've made a classic mistake: you've put the submit button in a different form than the input fields. The submit button needs to go in the same form as the input fields which you would like to send along with the submit.

3
追加された
私は2つの推測、他のアイデアのいずれかを持っていない奇妙なこと?
追加された 著者 Mahmoud Saleh,
いいえ、私はビューのためのコードを追加しました、助言してください。
追加された 著者 Mahmoud Saleh,
ああ、私の間違いをもう一度:(
追加された 著者 Mahmoud Saleh,
さて、プロセス検証段階は、入力コンポーネントに対しては完全にスキップされているようです。コマンドボタンに immediate = "true" はありませんか?
追加された 著者 BalusC,
コマンドボタンの形式が異なります。確かに別のフォームの入力を提出しません。入力とコマンドを同じフォームに入力します。不思議なことに、これはまさにあなたが回答したものです。今日も同様の問題を抱えた別の質問に回答し、またコメント
追加された 著者 BalusC,
発生する可能性があります。ハッピーコーディング:)
追加された 著者 BalusC,