¿Cómo usa Spring Boot la anotación @Validated para la validación de datos?
La validación de datos suele ser inevitable cuando se desarrollan aplicaciones. Spring Boot ofrece muchas opciones para validar datos en una aplicación, una de las cuales es usar @Validated
anotaciones . Este artículo presentará cómo usar @Validated
anotaciones para la validación de datos y proporcionará algunos códigos de muestra para ayudarlo a comprender mejor.
Introducción a @Validated
@Validated
es una anotación en Spring Boot para validar parámetros de método, parámetros de solicitud y cuerpos de solicitud. javax.validation
Es @Valid
una extensión de las anotaciones en , pero proporciona más funciones, como la validación de grupos y el orden de validación de parámetros.
Al usar @Validated
anotaciones , spring-boot-starter-validation
se debe agregar una dependencia a la aplicación Spring Boot para usar el validador. Un validador es una implementación en javax.validation
el paquete que valida objetos y propiedades.
Use @Validated en los parámetros del método
Cuando se usan @Validated
anotaciones , se pueden colocar en los parámetros del método para verificar la validez de los parámetros del método.
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
// 处理用户创建逻辑
}
En el código anterior, @Validated
la anotación se usa para @RequestBody
verificar User
si el objeto pasado en la anotación es válido. Si User
el objeto no es válido, MethodArgumentNotValidException
se lanzará una excepción. Si necesita un controlador de excepciones personalizado para manejar esta excepción, puede usar @ExceptionHandler
anotaciones .
También puede usar BindingResult
el objeto para obtener resultados de validación:
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// 处理验证错误
}
// 处理用户创建逻辑
}
En el código anterior, si hay algún error de validación, BindingResult
el objeto contendrá esos errores. Puede utilizar hasErrors()
el método para comprobar si hay errores y getFieldErrors()
los getGlobalErrors()
métodos para obtener una lista de errores.
Utilice @Validated en los parámetros de solicitud
Puede usar @Validated
anotaciones para validar los parámetros de la solicitud. En este ejemplo, usaremos @RequestParam
anotaciones para obtener los parámetros de la solicitud:
@GetMapping("/users")
public User getUser(@RequestParam("id") @Min(1) Long id) {
// 处理获取用户逻辑
}
En el código anterior, @Validated
la anotación se usa para @RequestParam
verificar id
si los parámetros pasados en la anotación son válidos. Si id
no es válido , MethodArgumentNotValidException
se lanzará una excepción.
Use @Validated en el cuerpo de la solicitud
Puede usar @Validated
anotaciones para validar objetos en el cuerpo de la solicitud. En este ejemplo, usaremos @RequestBody
anotaciones para obtener el cuerpo de la solicitud:
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
// 处理用户创建逻辑
}
En el código anterior, @Validated
la anotación se usa para @RequestBody
verificar User
si el objeto pasado en la anotación es válido. Si User
el objeto no es válido, MethodArgumentNotValidException
se lanzará una excepción.
verificar grupo
De forma predeterminada, el validador validará todas las anotaciones en el objeto. Sin embargo, a veces es posible que desee separar las validaciones en varios grupos. Por ejemplo, es posible que necesite validar todas las propiedades al crear un objeto, pero solo validar las propiedades requeridas al actualizar un objeto.
Para definir agrupaciones, use @javax.validation.groups.Default
anotaciones para grupos predeterminados y anotaciones personalizadas para definir otros grupos. En el siguiente ejemplo, Create
definimos Update
dos grupos, y :
public interface Create {}
public interface Update {}
public class User {
@NotNull(groups = Create.class)
private String name;
@NotNull(groups = {Create.class, Update.class})
private String email;
// getters/setters omitted
}
En el código anterior, los atributos y@NotNull
están marcados , pero sus atributos son diferentes. El atributo solo se valida en el grupo , mientras que el atributo se valida en los grupos y.name
email
groups
name
Create
email
Create
Update
Para especificar un grupo al usar @Validated
una anotación , pase el grupo como el segundo argumento de @Validated
la anotación. En el siguiente ejemplo, pasamos Create
el grupo a @Validated
la anotación:
@PostMapping("/users")
public User createUser(@RequestBody @Validated(Create.class) User user) {
// 处理用户创建逻辑
}
En el código anterior, @Validated
la anotación solo valida las anotaciones en Create
el grupo y, por lo tanto, solo name
el atributo.
Definir un validador personalizado
A veces, los validadores incorporados no satisfacen sus necesidades. Por ejemplo, es posible que deba verificar que los nombres de usuario sean únicos, lo que requiere acceso a una base de datos. En este caso, puede definir su propio validador.
Para definir un validador personalizado, cree una clase que implemente javax.validation.ConstraintValidator
la interfaz . En el siguiente ejemplo, crearemos un validador que verifique que los nombres de usuario sean únicos:
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return userRepository.findByUsername(value) == null;
}
}
En el código anterior, UniqueUsernameValidator
se implementa ConstraintValidator
la interfaz , que tiene dos parámetros genéricos. El primer parámetro es el tipo de anotación personalizada y el segundo parámetro es el tipo del valor que se va a validar.
En isValid()
el método , verificamos value
que es null
, y si no, verificamos si ya existe un usuario con el mismo nombre de usuario en la base de datos. Devuelve si no está presente, true
de lo contrario devuelve false
.
Después de definir un validador personalizado, debemos crear una anotación personalizada para usar en el código. En el siguiente ejemplo, crearemos una @UniqueUsername
anotación :
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {UniqueUsernameValidator.class})
public @interface UniqueUsername {
String message() default "用户名已存在";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
En el código anterior, usamos @Constraint
anotaciones para asociarlas UniqueUsernameValidator
con @UniqueUsername
anotaciones . También definimos mensajes de error predeterminados groups
y payload
atributos que se pueden usar para agrupar y metadatos.
Ahora, podemos usar @UniqueUsername
la anotación :
public class User {
@NotNull
@UniqueUsername
private String username;
// getters/setters omitted
}
En el código anterior, username
hemos utilizado @UniqueUsername
la anotación en el atributo, que llamará al validador personalizado que definimos para verificar que el nombre de usuario es único.
Resumir
En este artículo, presentamos cómo usar @Validated
anotaciones para la validación de datos. También cubrimos cómo usar @Validated
anotaciones , y cómo definir agrupaciones y validadores personalizados. Mediante el uso @Validated
de anotaciones , puede validar fácilmente los datos en su aplicación y garantizar la integridad y coherencia de los datos.