質問: {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(); } } ```
回答: 参照されているリンク先のコードで検証を実装しているのは `CustomSizeValidator` クラスの `isValid` メソッド ``` @Override public boolean isValid(String value, ConstraintValidatorContext context) { // CustomSizeUtil はチェックロジックだけを記述したクラス // getLength の戻り値は int return CustomSizeUtil.getLength(value) <= max; } ``` です。 このメソッドで、引数で渡された文字列に > > 全角英小文字 > > > が含まれていれば`false`を返すように実装することで実現できます。 なお、リンク先コードで > > 半角と全角を分けてカウント > > > しているのは、ここで呼んでいる`CustomSizeUtil.getLength(value)` メソッドです。 (どういう挙動なのか日本語からいまいち想像がつきませんが。) > > > ``` > @Override > public void initialize(CustomSize customSize) { > max = customSize.max(); > } > > ``` > > では、isValidメソッドを読んでないのですが、どうして上記コードがisValidメソッドの初期化に当たるのでしょうか? > > > 今回バリデーションを行っている機構はBean Validationという仕様を実装したもので、上記の質問に対する回答としては、「この仕様でそう決まっているから」と言うよりほかないです。 実際には、`initialize`メソッドや`isValid`メソッドは、フレームワークが呼び出しています。