javax.validation.ConstraintViolationException: проверка не удалась для классов в течение времени сохранения для групп [javax.validation.groups.Default,] - PullRequest
1 голос
/ 24 ноября 2011

Моя сущность имеет аннотации проверки бинов @NotBlank и @Size в поле name.Однако, когда я отправляю форму JSF с пустым полем name, это поле не проверяется.

Вот поле, о котором идет речь:

@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)

Как это вызвано, и теперь я могу решить эту проблему?


Обновление: вотсоответствующая часть зрения:

<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>

1 Ответ

3 голосов
/ 24 ноября 2011

Из стековой трассировки:

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

Это означает, что ваш метод действия JSF-компонента вызывается в любом случае, в то время как он должен был быть заблокирован ограничениями проверки в пустом поле name, и вы должны были увидетьошибка проверки в <h:message> или <h:messages> формы.

Это может означать только то, что вы положили immeditate="true" на командную кнопку / ссылку, что вызовет все компоненты ввода, которые не имеютэтот атрибут будет пропущен при обработке формы:

<h:commandButton ... immediate="true" />

или что у вас есть этот параметр контекста в вашем web.xml, который пропустит проверку пустых полей:

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>

или чтовы отключили проверку bean-компонента в своем представлении с помощью следующего тега:

<f:validateBean disabled="true" />

Убедитесь, что у вас нет ни одного из них.


Обновление : какв своем обновлении вы допустили классическую ошибку: вы поместили кнопку отправки в форме, отличной от полей ввода.Кнопка отправки должна быть в той же форме, что и поля ввода, которые вы хотите отправить вместе с отправкой.

...