Cómo omitir la validación JSR-303 Bean con JSF, cuando se hace clic en un botón?JSF 2.0: ¿Cómo saltarse la validación del bean JSR-303?
Un poco largo pregunta para explicar algunos enfoques ... Considere una lista en un formulario:
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
Cuando el usuario hace clic añadir o eliminar fila, la acción debe ejecutarse sin validación. El problema es que JSF vuelve a renderizar toda la lista e intenta validarla. Si hay cambios de borrador que no se validan, se producen errores de validación y nunca se llama al método de escucha (ya que la validación fallida evita eso). Sin embargo, agregar immediate="true"
en f: ajax permite que el método se ejecute a pesar de los errores de validación. Sin embargo, los errores de validación todavía ocurren y se muestran aquí.
veo dos opciones:
1) uso inmediato = "true" y no muestran errores de validación
Para no validador botones, ajuste inmediato = "true" y por h: mensajes hacen:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Entonces conjunto protegido botón (que realmente debe tratar de guardar el formulario) para enviar ese parámetro:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Esto provoca la validación, pero los mensajes simplemente no se muestran excepto cuando el parámetro SHOW_VALIDATION
está presente.
2) Declarar la validación en facelets condicionalmente:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
Y el botón Save-:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Esto provoca campos para validar sólo cuando el parámetro VALIDATE
está presente (= cuando el botón Guardar ha sido presionado).
Pero estos parecen una especie de pirateo. ¿Cómo puedo simplemente usar JSR-303 Bean Validation pero omitirlo cuando se declare?
Bueno, no he probado ninguna otra solución de validación que JSR-303 y facelets con JSF. Creo que este problema está relacionado con JSF y no con JSF-303; es como si se olvidaron de admitir "de forma nativa" la validación de omisión en JSF. Parece que hay mucha confusión en torno a esto ... –