javax.la validation.ConstraintViolationException: la validation a échoué pour des classes au cours de persister pour des groupes [javax.la validation.groupes de.Par défaut, ]
Mon entité a bean validation des annotations @NotBlank
et @Size
sur le name
champ. Cependant, lorsque je soumets le formulaire JSF avec le name
champ laissé vide, il ne valide pas le terrain.
Voici le domaine en question:
@NotBlank(message = "{name.required}")
@Size(max = 25, message = "{long.value}")
@Column(name = "name", length = 25, nullable = false)
private String name;
Lors de la soumission du formulaire, sans entrer toutes les données, j'obtiens l'exception suivante:
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)
Comment est-il la cause et maintenant, puis-je le résoudre?
Mise à jour: voici la partie pertinente de l'avis:
<h:form>
<ice:panelGrid columns="3">
<h:outputLabel>Department Name:</h:outputLabel>
<h:inputText id="name" value="#{departmentBean.departmentObj.name}" />
<h:message for="name" />
</ice:panelGrid>
</h:form>
<h:form>
<ice:panelGroup>
<h:commandLink value="Add New" action="#{departmentBean.addOrUpdateDepartment}" />
</ice:panelGroup>
</h:form>
Vous devez vous connecter pour publier un commentaire.
De la stacktrace:
Cela signifie que votre bean JSF action méthode est appelée de toute façon, tout ce qui devrait avoir été bloqué par les contraintes de validation dans le vide
name
champ et vous devriez avoir vu une erreur de validation dans un<h:message>
ou<h:messages>
de la forme.Cela ne peut signifier que vous avez mis
immeditate="true"
sur le bouton de commande/lien qui serait la cause de la saisie de tous les composants qui n'ont pas de cet attribut est ignoré dans le traitement du formulaire:ou que vous avez ce contexte paramètre dans votre
web.xml
qui serait ignorer la validation des champs vides:ou que vous avez désactivé le bean validation de votre point de vue par la balise suivante:
Assurez-vous que vous n'avez aucun de eux.
Mise à jour: selon votre mise à jour, vous avez fait une erreur classique: vous avez mis le bouton soumettre, sous une forme différente que les champs de saisie. Le bouton soumettre besoin d'aller dans la même forme que les champs de saisie qui vous souhaitez envoyer avec la soumettre.
immediate="true"
sur le bouton de commande?