Maison >Java >javaDidacticiel >Comment SpringBoot utilise la validation pour implémenter des paramètres de vérification élégants
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.
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
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>
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("Start app success."); } }
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; } }
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]
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
输出:age: age不能大于100小于0,
@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(); } }
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; } }
@NotEmpty(message = "name不能为空") @NameValidation private String name;
测试: http://localhost:8080/valid?age=105&name=lxy
输出:age: age不能大于100小于0, name: 不是合法的名字,
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!