javax.la validación.ConstraintViolationException: error de validación para las clases durante persisten tiempo para que los grupos [javax.la validación.grupos.Por defecto, ]

Mi entidad ha bean validation anotaciones @NotBlank y @Size en el name campo. Sin embargo, cuando presente el formulario JSF con el name campo se deja en blanco, no validar el campo.

Aquí está el campo en cuestión:

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

Cuando se envía el formulario sin introducir ningún dato, me estoy haciendo de la siguiente excepción:

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)

Cómo es esto causó y ahora puedo solucionarlo?


Actualización: aquí está la parte pertinente de la vista:

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

  1. 3

    Desde el stacktrace:

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

    Esto significa que su JSF bean método de acción se invoca de todos modos, mientras que este debería haber sido bloqueado por las restricciones de validación en el vacío name campo y usted debe haber visto un error de validación en un <h:message> o <h:messages> de la forma.

    Que sólo puede significar que usted ha puesto immeditate="true" en el botón de comando/enlace en el que haría que todos los componentes de entrada de los que no tienen este atributo se omitirán en el procesamiento del formulario:

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

    o que haya este parámetro de contexto en su web.xml que sería faltar a la validación de los campos vacíos:

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

    o que se ha desactivado el bean validation, en su opinión, por la siguiente etiqueta:

    <f:validateBean disabled="true" />

    Asegúrese de que usted no tiene ninguno de ellos.


    Actualización: según su actualización, has cometido un error clásico: te he puesto el botón de enviar de una forma diferente a la de los campos de entrada. El botón de envío debe ir en la misma forma que los campos de entrada que desea enviar, junto con el envío.

    • cosa extraña que no tengo ninguna de las dos conjeturas, cualquier otra idea ?
    • Así, que, al parecer, el proceso de validaciones fase es completamente omitidos por los componentes de entrada. No tiene un immediate="true" en el botón de comando?
    • nope, he añadido el código para ver, por favor avise.
    • Su botón de comando en un formulario diferente. Seguramente no presentar las entradas de otra forma. Poner las entradas y los comandos en el mismo formulario. Curiosamente esto es exactamente lo que usted ha answered a otra pregunta con similar problema de hoy y también me preguntó en un comment para la confirmación…
    • oh, mi error otra vez 🙁
    • Puede suceder. Feliz codificación 🙂

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea