2010-08-29 47 views
36

En el siguiente ejemplo, el parámetro ScriptFile está marcado con una anotación @Valid.¿Qué indica la anotación @Valid en Spring?

¿Qué hace la anotación @Valid?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)  
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   
    if (result.hasErrors()) {   
     modelMap.addAttribute("scriptFile", scriptFile);    
     modelMap.addAttribute("showcases", ShowCase.findAllShowCases());    
     return "scriptfile/create";    
    }   
    scriptFile.persist();   
    return "redirect:/scriptfile/" + scriptFile.getId();   
}  

Respuesta

26

Es para fines de validación.

Validación Es común validar un modelo después de que el usuario lo haya ingresado. Spring 3 proporciona compatibilidad para la validación declarativa con JSR-303. Este soporte se habilita automáticamente si un proveedor JSR-303, como Hibernate Validator, está presente en su classpath. Cuando está activado, puede validación gatillo simplemente anotar un parámetro del método controlador con la anotación @Valid: Después de la unión de la POST entrantes parámetros, el AppointmentForm se ser validada; en este caso, para verificar , el valor del campo de fecha no es nulo y ocurre en el futuro.


Mire aquí para más información:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

8

IIRC @Valid no es una anotación de la primavera, pero una anotación de JSR-303 (que es el estándar Bean Validation). Lo que hace es básicamente comprobar si los datos que envía al método son válidos o no (validará el scriptFile por usted).

1

Simplemente agregando a la respuesta anterior, en una aplicación web @valid se usa cuando el bean que se va a validar también se anota con anotaciones de validación, p. @NotNull, @Email (anotación de hibernación) por lo que cuando se recibe la información del usuario, los valores se pueden validar y el resultado vinculante tendrá los resultados de la validación. bindingResult.hasErrors() indicará si alguna validación falló.

5

Agregando a respuestas anteriores, echar un vistazo a continuación. La columna de fecha de AppointmentForm está anotada con un par de anotaciones. Al tener @Valid anotación que desencadena validaciones en el AppointmentForm (en este caso @NotNull y @Future). Estas anotaciones pueden provenir de diferentes proveedores de JSR-303 (por ejemplo, Hibernate, Spring..etc).

@RequestMapping(value = "/appointments", method = RequestMethod.POST) 
    public String add(@Valid AppointmentForm form, BindingResult result) { 
     .... 
    } 

    static class AppointmentForm { 

     @NotNull @Future 
     private Date date; 
    } 
1
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   

supongo que esto @NotNull anotación es válida, por lo tanto si no se necesita condiciones.

3

@Valid en sí no tiene nada que ver con Spring. Es parte de la especificación de validación de Bean (hay varios de ellos, el último es JSR 380 a partir de la segunda mitad de 2017), pero @Valid es muy antiguo y deriva todo el camino de JSR 303.

Como todos sabemos, Spring es muy bueno para proporcionar integración con todos los JSR y bibliotecas de Java en general (piense en JPA, JTA, Caching, etc.) y, por supuesto, esos tipos también se encargaron de la validación. Uno de los componentes clave que facilita esto es MethodValidationPostProcessor.

Intentando responder a su pregunta - @Valid es muy útil para la llamada cascada de validación cuando quiere validar un gráfico complejo y no solo un elemento de nivel superior de un objeto. Cada vez que desee profundizar, debe usar @Valid. Eso es lo que JSR dicta. Spring cumplirá con algunas desviaciones menores (por ejemplo, traté de poner @Validated en lugar de @Valid en el método RestController y trabajos de validación, pero no se aplicará para los beans de "servicio" regulares).

Cuestiones relacionadas