Tener este método de controlador:

@RequestMapping(method = RequestMethod.POST, value = "/myform1")
public String formPost(@ModelAttribute("myModel") @Valid MyModel myModel, BindingResult binder)

¿Cómo puedo ignorar los errores en ciertos (o todos) los campos?

Incluso si omito la anotación @Valid, aún detecta errores como "abc ingresado en un campo de Número" (es decir, binder.hasErrors() devuelve verdadero). Y el mensaje de error (del catálogo) se muestra en la página web final, que no quiero.

Si omito el BindingResult binder, entonces el código nunca llega a este método pero arroja una excepción / error antes.

¿Existe una anotación @DontValidateAtAll o algún otro método para lograr esto?

Problema relacionado: no puedo anular el valor incorrecto en el método, sigue mostrando el valor rechazado anterior. Por ejemplo, el usuario ingresa "abc" en myModel.someNumber y envía el formulario, incluso si lo hago myModel.setSomeNumber(22) en el método formPost (), después de regresar de él, la página web (JSP) mostrará " abc "(y el texto de error) en lugar de 22 en ese campo.

0
David Balažic 17 dic. 2019 a las 19:40

2 respuestas

La mejor respuesta

Esto funciona:

  • agregue un parámetro de Mapa (Modelo) al método del controlador (generalmente se usa de todos modos, lo omití en la pregunta por brevedad)
  • sobrescribir el atributo del modelo con una copia nueva

Código:

@RequestMapping(method = RequestMethod.POST, value = "/myform1")
public String formPost(@ModelAttribute("myModel") @Valid MyModel myModel, BindingResult binder, Map<String, Object> modmap) {
    if(ignore_errors) {
        modmap.put("myModel", new MyModel());
        return "myForm.jsp";
    } // else ... other things
}

Aparentemente, este procedimiento hace que el marco se "olvide" de los errores de validación.

Nota: Yo uso Spring 3.0.x, otras versiones pueden comportarse de manera diferente.

0
David Balažic 18 dic. 2019 a las 12:32

Para la excepción de conversión de Cadena a Número específica a la que se refería, puede usar la siguiente manipulación. Esta es una excepción de conversión de tipo que ocurre incluso antes de la validación del formulario de Spring MVC, es decir, incluso antes del método validate ().

Si su único propósito es NO ver los errores en su página web final, puede escribir código adicional en su método de Controlador.

@RequestMapping(method = RequestMethod.POST, value = "/myform1")
public ModelAndView formPost(@ModelAttribute("myModel") @Valid MyModel myModel, BindingResult binder){

  List<ObjectError> errors = bindingResult.getAllErrors();

  boolean hasIgnorableErrorsOnly = true;
  if(bindingResult.hasErrors()){
     for(ObjectError error : errors){
         if(error.getCode().equals("myModel.someNumber.NotANumber")){ //or whatever your error code is

         }else{
            hasIgnorableErrorsOnly = false;
         }
     }
  }
  if(hasIgnorableErrorsOnly){
    //You have not shown where your final view is. I am assuming your myModel form view is myform.jsp and final web page is myModel.jsp
    // Notice that I have also changed this method signature to return ModelAndView instead of only String view.
    if(myModel.getSomeNumber() == null)
       myModel.setSomeNumber(22);
    return new ModelAndView("myModel.jsp", myModel); //Take care of view Resolvers here
  }else{
    return new ModelAndView("myform.jsp", myModel); //Take care of view Resolvers here
  }
}

Ahora, si su BindingResult tiene errores más que ignorables, iría a myModel.jsp y creo que ya tiene un código para mostrar los errores. Pero si, debido al código anterior, se lo reenvía a myModel.jsp, deberá iterar sobre la tecla $ {errors} en su jsp y escribir el elemento someNumber para que no muestre errores. Por ejemplo,

 <spring:hasBindErrors name="myModel">
    <c:forEach items="${errors.allErrors}" var="error">
       <c:if test="${error.code eq 'myModel.someNumber.NotANumber'}">
           //skip your display of global errors
       </c:if>
    </c:forEach>
 </spring:hasBindErrors>
0
Monica Lavale 17 dic. 2019 a las 22:02