TL;DR
springの組み込みバリデーションで@NotNull
@NotEmpty
@NotBlank
はあるけどnull許容だが空文字は非許容というカスタムバリデーションを作った
既存の組み合わせで実現できそうなので@Constraint(validatedBy = [])
に詳しい人いたらご教授をお願いしたいです
作成したコード
まずはアノテーション
@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@ReportAsSingleViolation
@Constraint(validatedBy = [NotBlankAllowNullValidator::class])
annotation class NotBlankAllowNull(
val message: String = "空文字とスペース以外の入力のみ許容",
val groups: Array<KClass<out Any>> = [],
val payload: Array<KClass<out Payload>> = []
)
続いてバリデーター
class NotBlankAllowNullValidator : ConstraintValidator<NotBlankAllowNull, Any> {
override fun initialize(constraintAnnotation: NotBlankAllowNull) {}
override fun isValid(value: Any?, context: ConstraintValidatorContext?): Boolean {
value ?: return true
return value.toString().isNotBlank()
}
}
もやもや
Q.これでダメなんですか
A.ダメなわけではない
でも既存のバリデーターの組み合わせで行けそうな気がするやん?
というか集合で考えればもちろんいける
ただ、入社して日が浅いせいで半ば写経的にコードを書いているのでカスタムアノテーションについてなにもわかっていない
どうやら@Constraint(validatedBy = [])
のところをいじったらいけそうな気はするけどどのドキュメントを読めばいいのかわかっていない状態
そもそもアノテーションってandで条件付与されていくけどorで付け足したりできないのかな?
notとかできるならもっと柔軟に対応できそうだけど可読性は下がりそう。
@NotNull
@Null
で別々に作られているから厳しい気はしているけど
終わりに
冒頭にも書いたけどカスタムアノテーション詳しいマンいたら駆け出しエンジニアに救いの手をどうぞよろしくお願いします