notacion - java lang annotation
¿Qué indica la anotación @Valid en Spring? (6)
En el siguiente ejemplo, el parámetro ScriptFile
está marcado con una anotación @Valid
.
¿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();
}
Agregando a las respuestas anteriores, eche un vistazo a los siguientes. 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 venir de diferentes proveedores 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;
}
Es para fines de validación.
Validación Es común validar un modelo después de vincular la entrada del usuario. Spring 3 proporciona soporte para la validación declarativa con JSR-303. Esta compatibilidad se habilita automáticamente si un proveedor JSR-303, como Hibernate Validator, está presente en su classpath. Cuando está habilitado, puede activar la validación simplemente anotando un parámetro de método de controlador con la anotación @Valid: después de vincular los parámetros de POST entrantes, se validará el AppointmentForm; en este caso, para verificar que el valor del campo de fecha no sea nulo y ocurra en el futuro.
Mira aquí para más información:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/
IIRC @Valid no es una anotación de Spring sino una anotación JSR-303 (que es el estándar de Validación de Bean). 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).
Simplemente añadiendo a la respuesta anterior, en una aplicación web se utiliza @valid
donde el bean que se va a validar también se anota con anotaciones de validación, por ejemplo @NotNull
, @Email
(anotación de hibernación), de modo que cuando se reciben comentarios del usuario, los valores pueden validarse y el resultado vinculante tendrá los resultados de validación. bindingResult.hasErrors()
dirá si alguna validación falló.
@Valid
en sí mismo no tiene nada que ver con Spring. Es parte de la especificación de validación de Bean (hay varias, la última es JSR 380 a partir de la segunda mitad de 2017), pero @Valid
es muy antigua y deriva completamente 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 quieras profundizar, debes usar @Valid
. Eso es lo que JSR dicta. Spring cumplirá con algunas desviaciones menores (por ejemplo, intenté poner @Validated
lugar de @Valid
en el método RestController y la validación funciona, pero lo mismo no se aplicará a los beans "de servicio" regulares).
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
Supongo que esta anotación @NotNull
es válida, por lo tanto, si la condición no es necesaria.