ホームページ  >  記事  >  Java  >  SpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法

SpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法

WBOY
WBOY転載
2023-05-17 09:31:101181ブラウズ

1. はじめに

データ検証はインタラクティブな Web サイトに不可欠な機能です。フロントエンドの JS 検証は、ユーザー名の一意性、誕生日の形式、電子メール形式の検証などの一般的に使用される検証など、ほとんどの検証責任をカバーできます。等々。ただし、ユーザーがブラウザをバイパスし、http ツールを使用してバックエンドから何らかの不正なデータを直接要求することを防ぐために、ダーティ データがデータベースに落ち込むのを防ぐためにサーバー側のデータ検証も必要です。データベースを削除すると、運用担当者や保守担当者にとっても頭痛の種になります。この記事で説明されている検証を使用して、データを検証できます。

2. 一般的に使用される検証

1.JSR303/JSR-349: JSR303 は標準です。仕様のみを提供しますが、実装は提供しません。いくつかの検証仕様、つまり検証アノテーションを規定しています。 @ Null、@NotNull、@Pattern は、javax.validation.constraints パッケージの下にあります。 JSR-349 は、いくつかの新機能を追加したアップグレード バージョンです。

  • #@Null 注釈付き要素は null である必要があります

  • @NotNull 注釈付き要素は null であってはなりません

    #@AssertTrue 注釈付きの要素は true である必要があります
  • @AssertFalse 注釈付きの要素は false である必要があります
  • @Min( value) 注釈付きの要素は数値である必要があり、その値は指定された最小値以上である必要があります
  • @Max(value) 注釈付きの要素は数値である必要があり、その値は次のとおりである必要があります。指定された最大値と等しい
  • @DecimalMin(value) 注釈が付けられた要素は数値である必要があり、その値は指定された最小値以上である必要があります
  • @DecimalMax(value) 注釈が付けられた要素は数値である必要があり、その値は指定された最大値以下である必要があります
  • @Size (最大、最小) 注釈付き要素のサイズは指定された範囲内である必要があります
  • @Digits (整数、分数) 注釈付き要素は数値である必要があり、その値は次の範囲内である必要があります許容範囲
  • @Past 注釈付き要素は過去の日付である必要があります
  • @Future 注釈付き要素は将来の日付である必要があります
  • @Pattern(value) アノテーションが付けられた要素は、指定された正規表現に準拠する必要があります。
  • 2.hibernate 検証: Hibernate 検証はこの仕様の実装であり、 @Email、@Length、@Range などの他の検証アノテーションを追加します。

@Email 注釈付き要素は電子メール アドレスである必要があります
  • @Length 注釈付き文字列のサイズは指定された範囲内である必要があります
  • @NotEmpty 注釈付き文字列のサイズは空でない必要があります
  • ## @Range 注釈付きの要素は適切な範囲内にある必要があります

  • 3.spring 検証: Spring 検証は Hibernate 検証を再カプセル化し、springmvc モジュールに自動検証を追加します。検証情報は特定のクラスにカプセル化されます

  • 3. Spring Boot の自動データ検証機能

3.1 依存関係の紹介

Spring-Web モジュールは Hibernate -validation と databind を使用します。 module は、対応するデータ バインディング関数も提供します。

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

Spring-boot-starter-web 依存関係を導入するだけで済みます。そのサブ依存関係を見ると、次の依存関係が見つかります:

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

3.2 スタートアップ クラスをビルドする

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

3.3 検証が必要なエンティティクラスを作成する

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 コントローラー内のデータを検証する

#springmvc は、フォームパラメータを自動的にカプセル化する機能、つまりパラメータを追加する機能を提供します。検証 一般的なコントローラを以下に示します。

@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";
}

注目すべき点:

@Validated アノテーションをパラメーター Persison の前に追加する必要があります。これは、Spring が検証する必要があることを示し、検証情報が保存されます。後続の BindingResult に渡されます。検証する必要があるパラメータが複数ある場合は、次の形式になります。 valid(@Validated Person person, BindingResult personBindingResult, @Validated Person2 person2, BindingResult person2BindingResult); つまり、1 つの検証クラスが 1 つの検証結果に対応します。

    検証結果は自動的に入力されます。コントローラーでは、エラー ページへのジャンプなど、ビジネス ロジックに基づいて特定の操作を決定できます。
  • 最も基本的な検証が完了しました。
  • コンテナを起動すると、テスト結果は次のようになります:

オブジェクト ' のフィールド エラーperson' フィールド 'age': 値が拒否されました [105]; コード [Range.person.age,Range.age,Range.int,Range]; 引数 [org.springframework.context.support.DefaultMessageSourceResolvable: コード [person.age] ,age ]; 引数 []; デフォルトのメッセージ [age],100,0]; デフォルトのメッセージ [age は 100 を超え、0 未満にすることはできません]

#3.5 統合例外処理

前のメソッドの検証エラーの処理は少し複雑で、ほとんどの Web サイトはリクエスト エラーを統合された 404 ページにカプセル化します。データ検証が失敗すると、Spring Boot は BindException 例外をスローします。この例外をキャプチャし、結果のカプセル化を使用して、結果を返します。例外をキャッチするクラスを定義するには、@RestControllerAdvice を使用します。

コントローラー クラス:

@RequestMapping(value = "valid", method = RequestMethod.GET)
public String valid(@Validated Person person) {
    System.out.println(person);
    return "success";
}
統合例外処理クラス:

@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();
    }
}

テスト: http://localhost:8080/valid?age=105&name=steven

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

SpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法

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: 不是合法的名字,

SpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法

以上がSpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。