1
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?

More than 3 years have passed since last update.

ブランクのみ弾くカスタムバリデーション(null許容)

Posted at

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で別々に作られているから厳しい気はしているけど

終わりに

冒頭にも書いたけどカスタムアノテーション詳しいマンいたら駆け出しエンジニアに救いの手をどうぞよろしくお願いします

1
0
1

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
1
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?