Pour vérifier les paramètres de la méthode, la manière la plus simple et la plus violente de l'écrire est comme ceci :
public static void utilA(String a,BigDecimal b){ if (StringUtils.isEmpty(a)){ System.out.println("a不可为空"); return; } if (b == null){ System.out.println("b不可为空"); return; } if (b.compareTo(BigDecimal.ZERO) != 1){ System.out.println("b的取值范围不正确"); return; } System.out.println("do something"); }
Il n'y a aucun problème d'un point de vue fonctionnel.
Mais du point de vue de la maintenabilité à long terme du code, le taux de réutilisation du code est faible une fois qu'il y a trop de règles de vérification, il est difficile à maintenir, et cela semble maladroit pour les ingénieurs un peu persévérants, par exemple. une grande chose est quand même assez grande. Difficile à accepter.
Bien qu'il existe certaines solutions telles que Preconditions (com.google), il est difficile de s'adapter à tous les scénarios et n'est pas aussi confortable à utiliser qu'il devrait l'être.
Spring recommande officiellement une vérification élégante au niveau de la méthode avec une sémantique claire (vérification des paramètres d'entrée, vérification de la valeur de retour)
Officiel de Spring dans la documentation SpringBoot, la solution donnée pour la vérification des paramètres (Validation) est la suivante :
@Service @Validated public class MyBean { public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code, Author author) { ... } }
Document du site officiel de Spring Boot "37. Validation"
C'est-à-dire utiliser la spécification JSR-303 et utiliser directement les annotations pour la vérification des paramètres.
(JSR-303 est une sous-spécification de JAVA EE 6, appelée Bean Validation, et l'implémentation de référence officielle est Hibernate Validator)
2.2.1 Introduction aux annotations
Pour des raisons simples. tapez les paramètres (Non-Bean), utilisez des annotations pour ajouter des règles de contrainte directement avant les paramètres. Les annotations sont les suivantes :
@AssertTrue / @AssertFalse
Champs applicables de validation : booléen
Description de l'annotation : Vérifiez si la valeur est vraie / fausse
@DecimalMax / @DecimalMin
Champs applicables de validation : BigDecimal, BigInteger, String, byte, short, int, long
Annotation : Vérifiez si la valeur est inférieure ou égale à la valeur décimale spécifiée. Veuillez noter qu'il existe des problèmes de précision avec les décimales
@Digits
Vérification. champs applicables : BigDecimal, BigInteger, String,byte, short, int, long
Annotation : Vérifiez si la composition numérique de la valeur est légale
Description de l'attribut : entier : Spécifiez le nombre de chiffres dans la partie entière. fraction : spécifie le nombre de chiffres dans la partie fractionnaire.
@Future / @Past
Champs applicables de validation : Date, Calendrier
Description de l'annotation : Vérifiez si la valeur est après/avant l'heure actuelle
Description de la propriété : Public
@Max / @Min
Vérification Champs applicables : BigDecimal, BigInteger, String, byte, short, int, long
Annotation : Vérifiez si la valeur est inférieure ou égale à la valeur entière spécifiée
Description de l'attribut : Public
Remarque : Il est recommandé de utilisez les types Stirng et Integer. Il n'est pas recommandé d'utiliser le type int car la valeur soumise par le formulaire ne peut pas être convertie en int lorsqu'elle est ""
@NotNull / @Null
Champs applicables à la vérification : type de données de référence.
Remarque : Vérifiez si la valeur est non nulle / Vide
Description de l'attribut : Public
@NotBlank Vérifiez si la chaîne de contrainte est Null et si la longueur de la chaîne coupée est supérieure à 0, uniquement pour les chaînes, et les espaces de début et de fin seront supprimés.
@NotEmpty Vérifiez la contrainte si l'élément est Null ou EMPTY.
La différence entre @NotBlank et @NotEmpty : L'espace ("") est légal pour NotEmpty, mais NotBlank. lancera une exception de vérification
@Pattern
Champs applicables de validation : Chaîne
Annotation : Vérifiez si la valeur est équipée d'une expression régulière
Description de l'attribut : regexp : Indicateurs d'expression régulière : Un tableau spécifiant Pattern.Flag, représentant les options associées de l’expression régulière.
@Size
Champs applicables de vérification : String, Collection, Map, Array
Annotation : Vérifiez si la valeur répond à l'exigence de longueur
Description de l'attribut : max : spécifie la longueur maximale, min : spécifie la longueur minimale.
@Length(min=, max=) : Spécifiquement appliqué au type String
@Valid
Champs applicables de vérification : Vérifiez de manière récursive l'objet associé
Remarque : Si l'objet associé est une collection ou un tableau, puis effectuez une vérification récursive sur les éléments. S'il s'agit d'une carte, vérifiez la partie valeur (si vous souhaitez effectuer une vérification récursive)
Description de l'attribut : Aucune
@Range(min=, max=) L'élément spécifié doit être compris dans les limites. la plage appropriée
@CreditCardNumber Vérification de la carte de crédit
@Email Vérifiez s'il s'agit d'une adresse e-mail Si elle est nulle, aucune vérification n'est effectuée et la vérification est réussie.
@URL(protocol=,host=, port=,regexp=, flags=)
2.2.2 Utiliser
1 Introduire les dépendances
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency>
2. La méthode est Lors de l'appel, si les paramètres réels transmis ne correspondent pas aux règles de contrainte, une ConstraintViolationException sera levée directement, indiquant que la vérification des paramètres a échoué.
import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; /** * @Author: wangxia * @Date: 2021/10/20 16:30 */ public class TestPerson { @NotEmpty(message = "用户名不能为空") private String username; @Min(value = 0,message = "年龄不能小于0岁") @Max(value =150,message = "年龄不能大于150岁") private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3.. Pour les paramètres de type Bean, ajoutez des annotations de contrainte à chaque champ à l'intérieur du Bean, puis ajoutez des annotations @Validated ou @Valid devant les paramètres de la méthode. Exemple :
@RequestMapping("/") @RestController public class TestValidatController { @PostMapping("/testValid") public String testValid(@Validated @RequestBody TestPerson testPerson){ return "测试成功"; } }
4. Interceptez les exceptions avec élégance. Cette étape peut être omise, mais elle sera renvoyée directement lors de la demande, avec une invite d'exception 400, ce qui n'est pas très élégant.
@ControllerAdvice @ResponseBody public class MethodArgumentNotValidHandel { @ExceptionHandler(value=MethodArgumentNotValidException.class) public JSONObject MethodArgumentNotValidHandler(HttpServletRequest request, MethodArgumentNotValidException exception) throws Exception { JSONObject result=new JSONObject(); result.put("code","fail"); JSONObject errorMsg=new JSONObject(); for (FieldError error : exception.getBindingResult().getFieldErrors()) { errorMsg.put(error.getField(),error.getDefaultMessage()); } result.put("msg",errorMsg); return result; } }
Ajouter une invite d'exception élégamment capturée :
Ne pas ajouter d'invite d'exception élégamment capturée :
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!