Maison > Java > javaDidacticiel > Comment implémenter une vérification élégante des paramètres en Java

Comment implémenter une vérification élégante des paramètres en Java

王林
Libérer: 2023-05-19 19:43:04
avant
2561 Les gens l'ont consulté

1. Introduction

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");
    }
Copier après la connexion

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.

2. Comment vérifier les paramètres avec élégance

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)

2.1 Conseils officiels

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) {
        ...
    }
 
}
Copier après la connexion

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 Instructions d'utilisation des annotations

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>
Copier après la connexion

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;
    }
}
Copier après la connexion

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 "测试成功";
    }
 
}
Copier après la connexion

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;
    }
 
}
Copier après la connexion

Ajouter une invite d'exception élégamment capturée :

Comment implémenter une vérification élégante des paramètres en Java

Ne pas ajouter d'invite d'exception élégamment capturée :

Comment implémenter une vérification élégante des paramètres en Java

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal