2つ以上のフィールドを組み合わせて検証するにはどうすればよいですか?

ダニエル・リコウスキー:

JPA 2.0 / Hibernate検証を使用してモデルを検証しています。2つのフィールドの組み合わせを検証する必要がある状況になりました。

public class MyModel {
    public Integer getValue1() {
        //...
    }
    public String getValue2() {
        //...
    }
}

との両方の場合、モデルは無効getValue1()getValue2()ありnull、そうでない場合有効です。

JPA 2.0 / Hibernateでこの種の検証を実行するにはどうすればよいですか?単純な@NotNull注釈の場合、検証に合格するには両方のゲッターがnull以外である必要があります。

Pascal Thivent:

複数のプロパティの検証では、クラスレベルの制約を使用する必要があります。ビーン検証スニークピーク部分II:カスタム制約

クラスレベルの制約

複数のプロパティにまたがる制約を適用したり、複数のプロパティに依存する制約を表現したりする機能について懸念を表明している方もいます。古典的な例は住所の検証です。アドレスには複雑なルールがあります。

  • 通りの名前はやや標準的で、確かに長さの制限がなければなりません
  • 郵便番号の構造は完全に国に依存します
  • 多くの場合、都市は郵便番号に関連付けることができ、いくつかのエラーチェックを実行できます(検証サービスにアクセスできる場合)。
  • これらの相互依存性のため、単純なプロパティレベルの制約は法案に適合します

Bean Validation仕様によって提供されるソリューションは2つあります。

  • グループとグループシーケンスを使用して、制約のセットを他の制約のセットの前に強制的に適用する機能を提供します。この件については、次のブログエントリで説明します。
  • クラスレベルの制約を定義することができます

クラスレベルの制約は、プロパティではなくクラスに適用される通常の制約(注釈/実装の組み合わせ)です。つまり、クラスレベルの制約は、プロパティ値ではなくオブジェクトインスタンスをで受け取りますisValid

@AddressAnnotation 
public class Address {
    @NotNull @Max(50) private String street1;
    @Max(50) private String street2;
    @Max(10) @NotNull private String zipCode;
    @Max(20) @NotNull String city;
    @NotNull private Country country;

    ...
}

@Constraint(validatedBy = MultiCountryAddressValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddressAnnotation {
    String message() default "{error.address}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

public class MultiCountryAddressValidator implements ConstraintValidator<AddressAnnotation, Address> {
    public void initialize(AddressAnnotation constraintAnnotation) {
    // initialize the zipcode/city/country correlation service
    }

    /**
     * Validate zipcode and city depending on the country
     */
    public boolean isValid(Address object, ConstraintValidatorContext context) {
        if (!(object instanceof Address)) {
            throw new IllegalArgumentException("@Address only applies to Address");
        }
        Address address = (Address) object;
        Country country = address.getCountry();
        if (country.getISO2() == "FR") {
            // check address.getZipCode() structure for France (5 numbers)
            // check zipcode and city correlation (calling an external service?)
            return isValid;
        } else if (country.getISO2() == "GR") {
            // check address.getZipCode() structure for Greece
            // no zipcode / city correlation available at the moment
            return isValid;
        }
        // ...
    }
}

高度な住所検証ルールは住所オブジェクトから除外され、によって実装されていMultiCountryAddressValidatorます。オブジェクトインスタンスにアクセスすることにより、クラスレベルの制約は非常に柔軟になり、複数の相関するプロパティを検証できます。順序付けはここでは方程式から除外されていることに注意してください。次の投稿でそれに戻ります。

専門家グループは、さまざまな複数のプロパティサポートアプローチについて議論しました。クラスレベルの制約アプローチは、依存関係を含む他のプロパティレベルのアプローチと比較して、十分な単純さと柔軟性の両方を提供すると思います。あなたのフィードバックは大歓迎です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2つ以上のフィールドを組み合わせて検証するにはどうすればよいですか?メソッドで

分類Dev

Django:2つのフィールドの組み合わせの存在を検証するにはどうすればよいですか?

分類Dev

SQL / Laravelで2つのフィールドの組み合わせを同じように見つけるにはどうすればよいですか?

分類Dev

SQL / Laravelで2つのフィールドの組み合わせを同じように見つけるにはどうすればよいですか?

分類Dev

2つ以上のフィールドをmongoDbc#ドライバーと組み合わせた式でフィルター/ソートするにはどうすればよいですか?

分類Dev

Matlabで2つ以上の画像を組み合わせるにはどうすればよいですか?

分類Dev

2つ以上のテンソルの要素のすべての組み合わせを生成するにはどうすればよいですか?

分類Dev

hapi / joiで。2つの異なるスキーマ検証を1つに組み合わせるにはどうすればよいですか?

分類Dev

2つのファイルを組み合わせるにはどうすればよいですか

分類Dev

2つの要素を組み合わせてフィルタリングを高速化するにはどうすればよいですか?

分類Dev

CakePHP 3で2つのフィールドを組み合わせたり、持ったりして、keyValueペア(表示フィールド)を作成するにはどうすればよいですか?

分類Dev

5つ以上のPDFをimagemagick変換と組み合わせるにはどうすればよいですか?

分類Dev

2つの検索コードを1つに組み合わせるにはどうすればよいですか

分類Dev

3つの異なるフィールドの値を組み合わせて、3つのフィールドすべてに値が入力されている場合にのみ非表示フィールドに設定するにはどうすればよいですか?

分類Dev

複数のフィールドの組み合わせでグループバンドを追加するにはどうすればよいですか?

分類Dev

フィールドが汚れている場合にのみCakePHP3の検証をオフにするにはどうすればよいですか?

分類Dev

2つのuser_idを持つテーブルを組み合わせてビューに表示するにはどうすればよいですか?

分類Dev

別のテーブル(Django)でフィールドの組み合わせを正しく適用するにはどうすればよいですか?

分類Dev

Pythonでデータを上書きせずに2つのファイルを組み合わせるにはどうすればよいですか?

分類Dev

2つのCSVファイルを組み合わせて特定の値をプロットするにはどうすればよいですか?

分類Dev

述語フィルターを組み合わせるにはどうすればよいですか?

分類Dev

SQL結合で両方の日付フィールドを組み合わせるにはどうすればよいですか?

分類Dev

3つのテーブル(MySQL)を組み合わせるにはどうすればよいですか?

分類Dev

2つの配列を組み合わせて同じ値でグループ化するにはどうすればよいですか?

分類Dev

2つのテンソルを組み合わせてオーバーラップするにはどうすればよいですか?

分類Dev

Tableau Desktop-複数の計算フィールドを1つに組み合わせて、フィルターとして使用するにはどうすればよいですか?

分類Dev

SQLAlchemyの「<< =」演算子と組み合わせて「ANY」フィルターを使用するにはどうすればよいですか?

分類Dev

$ groupと$ orの両方を、あるフィールドまたは別のフィールドに値を持つmongoおよびgroupレコードで組み合わせるにはどうすればよいですか?

分類Dev

2つの列を1つに組み合わせるにはどうすればよいですか?

Related 関連記事

  1. 1

    2つ以上のフィールドを組み合わせて検証するにはどうすればよいですか?メソッドで

  2. 2

    Django:2つのフィールドの組み合わせの存在を検証するにはどうすればよいですか?

  3. 3

    SQL / Laravelで2つのフィールドの組み合わせを同じように見つけるにはどうすればよいですか?

  4. 4

    SQL / Laravelで2つのフィールドの組み合わせを同じように見つけるにはどうすればよいですか?

  5. 5

    2つ以上のフィールドをmongoDbc#ドライバーと組み合わせた式でフィルター/ソートするにはどうすればよいですか?

  6. 6

    Matlabで2つ以上の画像を組み合わせるにはどうすればよいですか?

  7. 7

    2つ以上のテンソルの要素のすべての組み合わせを生成するにはどうすればよいですか?

  8. 8

    hapi / joiで。2つの異なるスキーマ検証を1つに組み合わせるにはどうすればよいですか?

  9. 9

    2つのファイルを組み合わせるにはどうすればよいですか

  10. 10

    2つの要素を組み合わせてフィルタリングを高速化するにはどうすればよいですか?

  11. 11

    CakePHP 3で2つのフィールドを組み合わせたり、持ったりして、keyValueペア(表示フィールド)を作成するにはどうすればよいですか?

  12. 12

    5つ以上のPDFをimagemagick変換と組み合わせるにはどうすればよいですか?

  13. 13

    2つの検索コードを1つに組み合わせるにはどうすればよいですか

  14. 14

    3つの異なるフィールドの値を組み合わせて、3つのフィールドすべてに値が入力されている場合にのみ非表示フィールドに設定するにはどうすればよいですか?

  15. 15

    複数のフィールドの組み合わせでグループバンドを追加するにはどうすればよいですか?

  16. 16

    フィールドが汚れている場合にのみCakePHP3の検証をオフにするにはどうすればよいですか?

  17. 17

    2つのuser_idを持つテーブルを組み合わせてビューに表示するにはどうすればよいですか?

  18. 18

    別のテーブル(Django)でフィールドの組み合わせを正しく適用するにはどうすればよいですか?

  19. 19

    Pythonでデータを上書きせずに2つのファイルを組み合わせるにはどうすればよいですか?

  20. 20

    2つのCSVファイルを組み合わせて特定の値をプロットするにはどうすればよいですか?

  21. 21

    述語フィルターを組み合わせるにはどうすればよいですか?

  22. 22

    SQL結合で両方の日付フィールドを組み合わせるにはどうすればよいですか?

  23. 23

    3つのテーブル(MySQL)を組み合わせるにはどうすればよいですか?

  24. 24

    2つの配列を組み合わせて同じ値でグループ化するにはどうすればよいですか?

  25. 25

    2つのテンソルを組み合わせてオーバーラップするにはどうすればよいですか?

  26. 26

    Tableau Desktop-複数の計算フィールドを1つに組み合わせて、フィルターとして使用するにはどうすればよいですか?

  27. 27

    SQLAlchemyの「<< =」演算子と組み合わせて「ANY」フィルターを使用するにはどうすればよいですか?

  28. 28

    $ groupと$ orの両方を、あるフィールドまたは別のフィールドに値を持つmongoおよびgroupレコードで組み合わせるにはどうすればよいですか?

  29. 29

    2つの列を1つに組み合わせるにはどうすればよいですか?

ホットタグ

アーカイブ