

[Spring カスタムアノテーションに出会った話 -
Qiita](https://qiita.com/b1ueskydragon/items/07ac1f9bc8c55dffc541)

上記のサイトを拝見しました。  
制約アノテーション(Constraint Annotation) には決まったひな形(message(), groups(), payload()
の設定が必須)があるということなのですが、下記のクラスに全角英小文字をエラーに設定する条件を付け加えることは可能でしょうか？

半角と全角を分けてカウントして最大長さを制限するためのアノテーション  
とあるのですが、どこのコードでそれを制限できているのかがわかりません。  
教えて頂きたいです。

[code]

    @Target({FIELD})
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = {CustomSizeValidator.class})
    public @interface CustomSize {
    
        String message() default "{validation.CustomSize.message}";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        int max();
    
        @Target({FIELD})
        @Retention(RUNTIME)
        @Documented
        @interface List {
            CustomSize[] value();
        }
    }
    
[/code]


CC BY-SA 4.0
2020-10-20T12:01:03.540
71355
2020-10-31T05:41:09.830
2020-10-20T16:38:10.780
3060
32774
question
java spring
Spring カスタムアノテーションの実装について


参照されているリンク先のコードで検証を実装しているのは `CustomSizeValidator` クラスの `isValid` メソッド

[code]

      @Override
      public boolean isValid(String value, ConstraintValidatorContext context) {
        // CustomSizeUtil はチェックロジックだけを記述したクラス
        // getLength の戻り値は int
        return CustomSizeUtil.getLength(value) <= max;
      }
    
[/code]

です。  
このメソッドで、引数で渡された文字列に

> 全角英小文字

が含まれていれば`false`を返すように実装することで実現できます。

なお、リンク先コードで

> 半角と全角を分けてカウント

しているのは、ここで呼んでいる`CustomSizeUtil.getLength(value)` メソッドです。  
(どういう挙動なのか日本語からいまいち想像がつきませんが。)

* * *

>
[code]

>     @Override
>     public void initialize(CustomSize customSize) {
>      max = customSize.max();
>     }
>  
[/code]

>
> では、isValidメソッドを読んでないのですが、どうして上記コードがisValidメソッドの初期化に当たるのでしょうか？

今回バリデーションを行っている機構は[Bean
Validation](https://beanvalidation.org/)という仕様を実装したもので、上記の質問に対する回答としては、「この[仕様](https://beanvalidation.org/2.0/spec/#constraintsdefinitionimplementation-
validationimplementation)でそう決まっているから」と言うよりほかないです。

実際には、`initialize`メソッドや`isValid`メソッドは、フレームワークが呼び出しています。


CC BY-SA 4.0
2020-10-29T12:43:31.463
71598
2020-10-31T05:41:09.830
2020-10-31T05:41:09.830
2808
2808
71355
answer