0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Jakarta Validation】別の項目の値が空欄の場合のみチェックを実施!

0
Last updated at Posted at 2026-04-11

結論

ecuacion-lib-validation と言うライブラリの @StringWhen などの validator では、「別の項目の値が空欄の場合」にのみ Jakarta Validation で検証する機能があります、と言うお話。

はじめに

ショッピングサイトの注文フォームで、「配送先住所」が未入力の場合は「受け取り方法」が「店頭受け取り」でなければならない、なんてケースを想像してみます。

こういった、別の項目が空欄の場合のチェック、service クラスに if 文を連ねる代わりに、validator でサクッと実装してみませんか?

@StringWhen

ecuacion-lib-validation というlibraryの @XxxWhen にはこの機能があります。
ここでは @StringWhen を使用します。

こんな形で指定します。

OrderInfo.java
@StringWhen(propertyPath = "deliveryType", string = {"STORE_PICKUP"}, 
    conditionPropertyPath = "deliveryAddress", conditionValue = ConditionValue.EMPTY)
public record OrderInfo(String deliveryAddress, String deliveryType) {

}

propertyPath という名称は、Jakarta Validation において field を特定する記述方法を表します。普通に field 名を書けばOKです。

見れば大体わかるとは思いますが一応説明すると、、、そもそもが英語なので英語で^^;

propertyPath (= deliveryType) is String (= "STORE_PICKUP") When conditionPropertyPath (= deliveryAddress) is conditionValue (= EMPTY).

deliveryAddressEMPTY(空欄)のときだけ、deliveryType"STORE_PICKUP" であることを検証するよ、と言うことですね。

ecuacion-lib-validation の導入方法

導入方法については下記記事をご参照ください。

基本的な使い方

validation 対象として、まずはこちらの OrderInfoWithMessage.java を使用します。

OrderInfoWithMessage.java
@StringWhen(propertyPath = "deliveryType", string = "STORE_PICKUP", 
    conditionPropertyPath = "deliveryAddress", conditionValue = ConditionValue.EMPTY,
    message = "配送先住所が未入力の場合は受け取り方法は「店頭受け取り」でなければなりません。")
public record OrderInfoWithMessage(String deliveryAddress, String deliveryType) {

}

そして、validation を実行する側のコードはこちら。

以下メソッドは単純に main メソッドから呼び出しています。以下同様。

Main.java(一部抜粋)
  private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

  public static void 基本的な使い方() {
    OrderInfoWithMessage order = new OrderInfoWithMessage(null, "HOME_DELIVERY");

    Set<ConstraintViolation<OrderInfoWithMessage>> set = validator.validate(order);
    for (ConstraintViolation<?> v : set) {
      System.out.println(v.getMessage());
    }
  }

deliveryAddressnull(空欄)にもかかわらず deliveryType"HOME_DELIVERY" なのでエラーになります。これを実行すると以下のメッセージが出力されます。

出力結果
配送先住所が未入力の場合は受け取り方法は「店頭受け取り」でなければなりません。

その他

その他の使用方法、when の条件、@StringWhen 以外の validator の一覧などは、以下をご参照ください。

サンプルコード

サンプルコードは以下です。
https://github.com/ecuacion-jp/ecuacion-code-snippets/tree/main/ecuacion-lib-validation-StringWhen

※このページから直接ソースの zip を download はできないと思うので、そのページにある ecuacion-code-snippets のリンクをクリックし、そこにある緑の <> Code ボタンから Download ZIP で download してください。

本サンプルのフォルダに移動後、mvn compile exec:java で実行できます。

まとめ

Jakarta Validation を使用し「別の項目の値が空欄の場合」のみ検証を実施する、@StringWhen など @XxxWhen のご紹介でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?