- 履歴一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Spring Boot/KotlinでCustom Validatorを作成する へ行く。
- 1 (2018-02-13 (火) 17:13:39)
- 2 (2018-02-13 (火) 17:44:09)
キーワード†
- Spring Boot
- Validation/Validator
- Kotlin
したいこと†
Kotlinでカスタム・バリデータを作成したい。
Javaでやるのと同じようにすればいいんだけど、Kotlinの文法的にちょっと躓いたのでメモです。
どうやって†
時間入力の前後チェックをしたいとして。
Period.kt†
package me.fukuchiharuki.example.validation.constraints import me.fukuchiharuki.example.validation.PeriodValidator import javax.validation.Constraint import javax.validation.Payload import kotlin.reflect.KClass @Target(AnnotationTarget.CLASS, AnnotationTarget.FIELD, AnnotationTarget.ANNOTATION_CLASS) @Retention(AnnotationRetention.RUNTIME) @Constraint(validatedBy = [PeriodValidator::class]) annotation class Period( val message: String = "{me.fukuchiharuki.example.validation.constraints.Period}", val groups: Array<KClass<*>> = [], val payload: Array<KClass<out Payload>> = [], val startField: String = "start", val endField: String = "end" )
PeriodValidator.kt†
package me.fukuchiharuki.example.validation import me.fukuchiharuki.example.validation.constraints.Period import org.springframework.beans.BeanWrapperImpl import java.time.LocalTime import javax.validation.ConstraintValidator import javax.validation.ConstraintValidatorContext class PeriodValidator: ConstraintValidator<Period, Object> { private var message: String = "" private var startField: String = "" private var endField: String = "" override fun initialize(constraintAnnotation: Period?) { if (constraintAnnotation === null) return message = constraintAnnotation.message startField = constraintAnnotation.startField endField = constraintAnnotation.endField } override fun isValid(value: Object?, context: ConstraintValidatorContext?): Boolean { val beanWrapper = BeanWrapperImpl(value) val startTimeInput = beanWrapper.getPropertyValue(startField).toString() val endTimeInput = beanWrapper.getPropertyValue(endField).toString() if (チェックする(startTimeInput, endTimeInput)) return true setContext(context!!) return false } private fun setContext(context: ConstraintValidatorContext) { context.disableDefaultConstraintViolation() context.buildConstraintViolationWithTemplate(message) .addPropertyNode(endField) .addConstraintViolation() } }
ちなみに†
TODO: あとで書く