Spring admite dos métodos de validación diferentes: la validación de Spring y la validación del bean JSR-303. Ambos se pueden usar definiendo un validador Spring que delegue a otros delegadores, incluido el validador de frijoles. Hasta aquí todo bien.
Pero cuando se anotan métodos para solicitar la validación, es otra historia. Puedo anotar así
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {
o así
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {
Aquí, @Valid es javax.validation.Valid y @Validated es org.springframework.validation.annotation.Validated . Los documentos de este último dicen
Variante de JSR-303's Valid, que soporta la especificación de grupos de validación. Diseñado para un uso conveniente con el soporte JSR-303 de Spring, pero no específico para JSR-303.
lo cual no ayuda mucho porque no dice exactamente en qué se diferencia. Como mucho. Ambos parecen funcionar bastante bien para mí.
fuente
Respuestas:
Como citó de la documentación,
@Validated
se agregó para admitir "grupos de validación", es decir, grupo de campos en el bean validado. Esto se puede utilizar en formularios de varios pasos en los que puede validar el nombre, el correo electrónico, etc. en el primer paso y luego en otros campos en los pasos siguientes.La razón por la que esto no se agregó a la
@Valid
anotación es porque está estandarizado usando el proceso de la comunidad java (JSR-303), lo que lleva tiempo y los desarrolladores de Spring querían permitir que las personas usaran esta funcionalidad antes.Vaya a este boleto de jira para ver cómo surgió la anotación.
fuente
Una respuesta más directa. Para aquellos que todavía no saben qué diablos es "grupo de validación" .
Uso para
@Valid
validaciónControlador:
Objeto de formulario:
Uso para el
@Validated
grupo de validaciónFuente: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html
Controlador:
Objeto de formulario:
fuente
En los fragmentos de código de ejemplo de la pregunta,
@Valid
y@Validated
no hay diferencia. Pero si@RequestBody
está anotado con unList
objeto, o es un valor de cadena anotado por@RequestParam
, la validación no tendrá efecto.Podemos usar la
@Validated
capacidad de validación a nivel de método de para que funcione. Para lograrlo, el punto clave es colocarlo@Validated
en la clase. Esta puede ser otra diferencia importante entre@Valid
y@Validated
en el marco de primavera.Referencia
fuente
List
objetos? Supongo que esto tampoco funcionará para otras colecciones comoMap
? Tal vez podría darme una explicación más detallada en mi pregunta: stackoverflow.com/questions/60167961/…además de lo anterior, solo puede solicitar
@Valid
en un dominio / campo para la validación anidada, no con un@validated
.fuente