目次
1. はじめに
2. 一般的に使用される検証
Spring-Web モジュールは Hibernate -validation と databind を使用します。 module は、対応するデータ バインディング関数も提供します。
Spring-boot-starter-web 依存関係を導入するだけで済みます。そのサブ依存関係を見ると、次の依存関係が見つかります:
#springmvc は、フォームパラメータを自動的にカプセル化する機能、つまりパラメータを追加する機能を提供します。検証 一般的なコントローラを以下に示します。
注目すべき点:
4、自定义校验注解
4.1 @NameValidation
4.2 校验类NameValidationValidator
4.3 在Person类增加新注解
ホームページ Java &#&チュートリアル SpringBoot が検証を使用してエレガントな検証パラメーターを実装する方法

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

May 17, 2023 am 09:31 AM
springboot validation

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Springboot が Jasypt を統合して構成ファイルの暗号化を実装する方法 Springboot が Jasypt を統合して構成ファイルの暗号化を実装する方法 Jun 01, 2023 am 08:55 AM

Jasypt の概要 Jasypt は、開発者が最小限の労力で基本的な暗号化機能を自分のプロジェクトに追加できる Java ライブラリであり、暗号化の仕組みを深く理解する必要はありません。一方向および双方向暗号化の高いセキュリティ。標準ベースの暗号化テクノロジー。パスワード、テキスト、数値、バイナリを暗号化します... Spring ベースのアプリケーション、オープン API への統合、JCE プロバイダーでの使用に適しています... 次の依存関係を追加します: com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1 Jasypt の特典はシステムのセキュリティを保護し、コードが漏洩した場合でもデータ ソースは保証されます。

SpringBoot が Redisson を統合して遅延キューを実装する方法 SpringBoot が Redisson を統合して遅延キューを実装する方法 May 30, 2023 pm 02:40 PM

使用シナリオ 1. 注文は正常に行われましたが、支払いが 30 分以内に行われませんでした。支払いがタイムアウトになり、注文が自動的にキャンセルされました 2. 注文に署名があり、署名後 7 日間評価が行われませんでした。注文がタイムアウトして評価されない場合、システムはデフォルトでプラスの評価を設定します 3. 注文は正常に行われます。販売者が 5 分間注文を受け取らない場合、注文はキャンセルされます。 4. 配送がタイムアウトします。 SMS リマインダーをプッシュします... 遅延が長く、リアルタイム パフォーマンスが低いシナリオでは、タスク スケジュールを使用して定期的なポーリング処理を実行できます。例: xxl-job 今日は選択します

Redis を使用して SpringBoot に分散ロックを実装する方法 Redis を使用して SpringBoot に分散ロックを実装する方法 Jun 03, 2023 am 08:16 AM

1. Redis は分散ロックの原則を実装しており、分散ロックが必要な理由 分散ロックについて話す前に、分散ロックが必要な理由を説明する必要があります。分散ロックの反対はスタンドアロン ロックです。マルチスレッド プログラムを作成するとき、共有変数を同時に操作することによって引き起こされるデータの問題を回避します。通常、ロックを使用して共有変数を相互に除外し、データの正確性を確保します。共有変数の使用範囲は同じプロセス内です。共有リソースを同時に操作する必要があるプロセスが複数ある場合、どうすれば相互排他的になるのでしょうか?今日のビジネス アプリケーションは通常マイクロサービス アーキテクチャであり、これは 1 つのアプリケーションが複数のプロセスをデプロイすることも意味します。複数のプロセスが MySQL の同じレコード行を変更する必要がある場合、順序の乱れた操作によって引き起こされるダーティ データを避けるために、分散が必要です。今回導入するスタイルはロックされています。ポイントを獲得したい

Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Jun 03, 2023 pm 04:38 PM

Springboot はファイルを読み取りますが、jar パッケージにパッケージ化した後、最新の開発にアクセスできません。jar パッケージにパッケージ化した後、Springboot がファイルを読み取れない状況があります。その理由は、パッケージ化後、ファイルの仮想パスが変更されるためです。は無効であり、ストリーム経由でのみアクセスできます。読み取ります。ファイルはリソースの下にあります publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBootとSpringMVCの比較と差異分析 SpringBootとSpringMVCの比較と差異分析 Dec 29, 2023 am 11:02 AM

SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivo​​tal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 SQL ステートメントを使用せずに Springboot+Mybatis-plus を実装して複数のテーブルを追加する方法 Jun 02, 2023 am 11:07 AM

Springboot+Mybatis-plus が SQL ステートメントを使用して複数テーブルの追加操作を実行しない場合、私が遭遇した問題は、テスト環境で思考をシミュレートすることによって分解されます: パラメーターを含む BrandDTO オブジェクトを作成し、パラメーターをバックグラウンドに渡すことをシミュレートします。 Mybatis-plus で複数テーブルの操作を実行するのは非常に難しいことを理解してください。Mybatis-plus-join などのツールを使用しない場合は、対応する Mapper.xml ファイルを設定し、臭くて長い ResultMap を設定するだけです。対応する SQL ステートメントを記述します。この方法は面倒に見えますが、柔軟性が高く、次のことが可能です。

SpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法 SpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法 Jun 03, 2023 am 11:32 AM

1. RedisAPI のデフォルトのシリアル化メカニズムである RedisTemplate1.1 をカスタマイズします。API ベースの Redis キャッシュ実装では、データ キャッシュ操作に RedisTemplate テンプレートを使用します。ここで、RedisTemplate クラスを開いて、クラスのソース コード情報を表示します。publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations、BeanClassLoaderAware{//キーを宣言、値の各種シリアル化メソッド、初期値は空 @NullableprivateRedisSe

Springbootでapplication.ymlの値を取得する方法 Springbootでapplication.ymlの値を取得する方法 Jun 03, 2023 pm 06:43 PM

プロジェクトでは、構成情報が必要になることがよくありますが、この情報はテスト環境と本番環境で構成が異なる場合があり、実際のビジネス状況に基づいて後で変更する必要がある場合があります。これらの構成をコードにハードコーディングすることはできません。構成ファイルに記述することをお勧めします。たとえば、この情報を application.yml ファイルに書き込むことができます。では、コード内でこのアドレスを取得または使用するにはどうすればよいでしょうか?方法は2つあります。方法 1: @Value アノテーションが付けられた ${key} を介して、構成ファイル (application.yml) 内のキーに対応する値を取得できます。この方法は、マイクロサービスが比較的少ない状況に適しています。方法 2: 実際には、プロジェクト、業務が複雑な場合、ロジック

See all articles