Maison  >  Article  >  Java  >  Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants

Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants

WBOY
WBOYavant
2023-05-17 09:31:101180parcourir

1. Avant-propos

La vérification des données est une fonction indispensable des sites Web interactifs. La vérification Front-end js peut couvrir la plupart des responsabilités de vérification, telles que l'unicité du nom d'utilisateur, le format d'anniversaire, la vérification du format d'e-mail, etc. Cependant, afin d'empêcher les utilisateurs de contourner le navigateur et d'utiliser les outils http pour demander directement certaines données illégales au backend, une vérification des données côté serveur est également nécessaire pour empêcher que des données sales ne tombent dans la base de données si un format de courrier électronique illégal apparaît. la base de données, cela causera également des maux de tête au personnel d'exploitation et de maintenance. Vous pouvez utiliser la validation décrite dans cet article pour vérifier les données.

2. Vérifications couramment utilisées

1.JSR303/JSR-349 : JSR303 est une norme qui fournit uniquement des spécifications mais pas d'implémentation. Elle stipule certaines spécifications de vérification, c'est-à-dire des annotations de vérification, telles que @Null, @NotNull, @Pattern, situé sous le package javax.validation.constraints. JSR-349 est sa version améliorée, ajoutant quelques nouvelles fonctionnalités.

  • @ null L'élément annoté doit être null

  • @ notnull L'élément annoté ne doit pas être null

  • @ asserttrue L'élément annoté doit être vrai

  • @ assertfalse L'élément annoté doit être faux

  • @Min(value) L'élément annoté doit être un nombre, sa valeur doit être supérieure ou égale à la valeur minimale spécifiée

  • @Max(value) L'élément annoté doit être un nombre, sa valeur doit être inférieur ou égal à la valeur maximale spécifiée

  • @DecimalMin(value) L'élément annoté doit être un nombre et sa valeur doit être supérieure ou égale à la valeur minimale spécifiée

  • @DecimalMax(value) Le l'élément annoté doit être un nombre, sa valeur doit être inférieure ou égale à la valeur maximale spécifiée

  • @Size(max, min) La taille de l'élément annoté doit être dans la plage spécifiée

  • @Digits ( entier, fraction) L'élément annoté doit être un nombre dont la valeur doit être dans la plage acceptable

  • @Past L'élément annoté doit être une date passée

  • @Future L'élément annoté doit être une date future

  • @ Pattern(value) L'élément annoté doit être conforme à l'expression régulière spécifiée

2.validation hibernate : la validation hibernate est l'implémentation de cette spécification et ajoute d'autres annotations de validation, telles que @Email, @Length, @ Range , etc.

  • @Email L'élément annoté doit être une adresse e-mail

  • @Length La taille de la chaîne annotée doit être dans la plage spécifiée

  • @NotEmpty La chaîne annotée doit être non vide

  • @Range L'élément annoté doit être dans la plage appropriée

3.validation spring : la validation spring ré-encapsule la validation hibernate, ajoute la validation automatique au module springmvc et les informations de vérification sont encapsulées dans une classe spécifique

3. Fonction de vérification automatique des données de Spring Boot

3.1 Présentation des dépendances

Le module spring-web utilise la validation hibernate et le module databind fournit également la fonction de liaison de données correspondante.

<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Il suffit d'introduire la dépendance spring-boot-starter-web Si vous regardez ses sous-dépendances, vous pouvez trouver les dépendances suivantes :

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

3.2 Construire la classe de démarrage

@SpringBootApplication
public class App {
   public static void main(String[] args) {
       SpringApplication.run(App.class, args);
       System.out.println("Start app success.");
   }
}

3.3 Créer la classe d'entité. qui doit être vérifié

public class Person {
    @NotEmpty(message = "name不能为空")
    private String name;
    @Range(min = 0, max = 100, message = "age不能大于100小于0")
    private int age;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3.4 Vérification des données dans le contrôleur

springmvc nous fournit la fonction d'encapsulation automatique des paramètres de formulaire. Un contrôleur typique avec vérification des paramètres ajoutée est le suivant.

@RequestMapping("/test")
public String valid(@Validated Person person, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            System.out.println(fieldError);
        }
        return "fail";
    }
    return "success";
}

Points à noter :

  • L'annotation @Validated doit être ajoutée avant le paramètre Persison, indiquant que Spring doit le vérifier, et les informations de vérification seront stockées dans le BindingResult suivant. Notez qu'ils doivent être adjacents. S'il y a plusieurs paramètres à vérifier, le formulaire peut être le suivant. valid (@Validated Person person, BindingResult personBindingResult, @Validated Person2 person2, BindingResult person2BindingResult); c'est-à-dire qu'une classe de vérification correspond à un résultat de vérification).

  • Les résultats de la vérification seront automatiquement renseignés et des opérations spécifiques peuvent être décidées en fonction de la logique métier du contrôleur, comme accéder à une page d'erreur.

Une vérification la plus élémentaire est terminée.

Démarrez le conteneur et les résultats du test sont les suivants :

Erreur de champ dans l'objet 'personne' sur le champ 'âge' : valeur rejetée [105] ; personne âge,Range.age,Range.int,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.age,age]; ; message par défaut [l'âge ne peut pas être supérieur à 100 et inférieur à 0]

3.5 Gestion unifiée des exceptions

La méthode précédente de gestion des erreurs de vérification est légèrement compliquée et la plupart des sites Web encapsulent les erreurs de demande dans une page 404 unifiée. la vérification des données échoue. Si elle est réussie, Spring Boot lancera une exception BindException. Nous pouvons intercepter cette exception et utiliser Result pour encapsuler le résultat renvoyé. Pour définir une classe de capture d'exceptions, utilisez @RestControllerAdvice.

Classe de contrôleur :

@RequestMapping(value = "valid", method = RequestMethod.GET)
public String valid(@Validated Person person) {
    System.out.println(person);
    return "success";
}

Classe de gestion unifiée des exceptions :

@RestControllerAdvice
public class BindExceptionHanlder {
    @ExceptionHandler(BindException.class)
    public String handleBindException(HttpServletRequest request, BindException exception) {
        List<FieldError> allErrors = exception.getFieldErrors();
        StringBuilder sb = new StringBuilder();
        for (FieldError errorMessage : allErrors) {
            sb.append(errorMessage.getField()).append(": ").append(errorMessage.getDefaultMessage()).append(", ");
        }
        System.out.println(sb.toString());
        return sb.toString();
    }
}

Test : http://localhost:8080/valid?age=105&name=steven

Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants

输出:age: age不能大于100小于0,

Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants

4、自定义校验注解

4.1 @NameValidation

@Documented
@Constraint(validatedBy = NameValidationValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
public @interface NameValidation {
    String message() default "不是合法的名字";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({PARAMETER, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        NameValidation[] value();
    }
}

4.2 校验类NameValidationValidator

public class NameValidationValidator implements ConstraintValidator<NameValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if ("steven".equalsIgnoreCase(value)) {
            return true;
        }
        String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate();
        System.out.println("default message :" + defaultConstraintMessageTemplate);
        //禁用默认提示信息
		//context.disableDefaultConstraintViolation();
        //设置提示语
		//context.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation();
        return false;
    }
}

4.3 在Person类增加新注解

@NotEmpty(message = "name不能为空")
@NameValidation
private String name;

测试: http://localhost:8080/valid?age=105&name=lxy

输出:age: age不能大于100小于0, name: 不是合法的名字,

Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer