¿Cómo usa Spring Boot la anotación @Validated para la validación de datos?

¿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 @Validatedanotaciones . Este artículo presentará cómo usar @Validatedanotaciones para la validación de datos y proporcionará algunos códigos de muestra para ayudarlo a comprender mejor.

inserte la descripción de la imagen aquí

Introducción a @Validated

@Validatedes una anotación en Spring Boot para validar parámetros de método, parámetros de solicitud y cuerpos de solicitud. javax.validationEs @Validuna 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 @Validatedanotaciones , spring-boot-starter-validationse debe agregar una dependencia a la aplicación Spring Boot para usar el validador. Un validador es una implementación en javax.validationel paquete que valida objetos y propiedades.

Use @Validated en los parámetros del método

Cuando se usan @Validatedanotaciones , 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, @Validatedla anotación se usa para @RequestBodyverificar Usersi el objeto pasado en la anotación es válido. Si Userel objeto no es válido, MethodArgumentNotValidExceptionse lanzará una excepción. Si necesita un controlador de excepciones personalizado para manejar esta excepción, puede usar @ExceptionHandleranotaciones .

También puede usar BindingResultel 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, BindingResultel 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 @Validatedanotaciones para validar los parámetros de la solicitud. En este ejemplo, usaremos @RequestParamanotaciones para obtener los parámetros de la solicitud:

@GetMapping("/users")
public User getUser(@RequestParam("id") @Min(1) Long id) {
    // 处理获取用户逻辑
}

En el código anterior, @Validatedla anotación se usa para @RequestParamverificar idsi los parámetros pasados ​​en la anotación son válidos. Si idno es válido , MethodArgumentNotValidExceptionse lanzará una excepción.

Use @Validated en el cuerpo de la solicitud

Puede usar @Validatedanotaciones para validar objetos en el cuerpo de la solicitud. En este ejemplo, usaremos @RequestBodyanotaciones para obtener el cuerpo de la solicitud:

@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
    // 处理用户创建逻辑
}

En el código anterior, @Validatedla anotación se usa para @RequestBodyverificar Usersi el objeto pasado en la anotación es válido. Si Userel objeto no es válido, MethodArgumentNotValidExceptionse 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.Defaultanotaciones para grupos predeterminados y anotaciones personalizadas para definir otros grupos. En el siguiente ejemplo, Createdefinimos Updatedos 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.nameemailgroupsnameCreateemailCreateUpdate

Para especificar un grupo al usar @Validateduna anotación , pase el grupo como el segundo argumento de @Validatedla anotación. En el siguiente ejemplo, pasamos Createel grupo a @Validatedla anotación:

@PostMapping("/users")
public User createUser(@RequestBody @Validated(Create.class) User user) {
    // 处理用户创建逻辑
}

En el código anterior, @Validatedla anotación solo valida las anotaciones en Createel grupo y, por lo tanto, solo nameel 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.ConstraintValidatorla 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, UniqueUsernameValidatorse implementa ConstraintValidatorla 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 valueque 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, truede 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 @UniqueUsernameanotació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 @Constraintanotaciones para asociarlas UniqueUsernameValidatorcon @UniqueUsernameanotaciones . También definimos mensajes de error predeterminados groupsy payloadatributos que se pueden usar para agrupar y metadatos.

Ahora, podemos usar @UniqueUsernamela anotación :

public class User {
    @NotNull
    @UniqueUsername
    private String username;

    // getters/setters omitted
}

En el código anterior, usernamehemos utilizado @UniqueUsernamela 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 @Validatedanotaciones para la validación de datos. También cubrimos cómo usar @Validatedanotaciones , y cómo definir agrupaciones y validadores personalizados. Mediante el uso @Validatedde anotaciones , puede validar fácilmente los datos en su aplicación y garantizar la integridad y coherencia de los datos.

Supongo que te gusta

Origin blog.csdn.net/2302_77835532/article/details/131341704
Recomendado
Clasificación