背景
JavaやSpringでバリデーションを実装する際には@NotNull
や@NotBlank
といったBeanValidationを用いることがあると思います。
実装をしている際に、これらのアノテーションに紐づいている実装クラスはどのようになっているのだろうかと思い、ソースコードを見てみたのですが、@Constraint
のvalidatedByが空白でした。
javax.validation.constraintsパッケージのNotBlankアノテーション1を例に出しておきます。
@Documented
@Constraint(validatedBy = { }) // ←でバリデーションの中身が書かれたクラスが指定されていない
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
public @interface NotBlank {
String message() default "{javax.validation.constraints.NotBlank.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
/**
* Defines several {@code @NotBlank} constraints on the same element.
*
* @see NotBlank
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface List {
NotBlank[] value();
}
}
今回はこのアノテーションの実装結果の場所と紐付けをしているクラスを調べました。
調査結果
Googleで検索してみると、こちらのstackoverflowで同様の質問がされており、実装クラスを知ることができました。
それがこちらのorg.hibernate.validator.internal.constraintvalidators.bv配下のNotBlankValidatorクラスです。
このことからアノテーションとその実装クラスは同じライブラリではなく、別のライブラリに存在しているということがわかりました。
また、これらを紐付けているクラスは実装クラスと同じライブラリに存在し、こちらのorg.hibernate.validator.internal.metadata.core配下のConstraintHelperクラスで紐づけられていることがわかりました。
まとめ
今回、BeanValidationのjavax.validation.constraintsに存在するアノテーションの実装クラスはorg.hibernate.validator.internal.constraintvalidators.bv配下に存在しているということがわかりました。
また、これらのクラスはorg.hibernate.validator.internal.metadata.core配下のConstraintHelperクラスで紐づけられていることがわかりました。
ただ、なぜアノテーションと実装クラスがわざわざ別のライブラリに存在しているのかがわかっていません。
BeanValidationとHibernateの関係性が関わっていそうな雰囲気はしますが、拡張性を考慮してインターフェースと実装を分けるような感覚なのでしょうか?
この点に関してご存知の方がいらっしゃいましたらご教示いただけますと幸いです。
最後までお読みいただき、ありがとうございました。
参考文献
-
jakarta.validation-api-2.0.1 ↩