Я недавно использовал валидатор для своего класса DTO для получения аннотаций, таких как валидация, например @NotNull или @ NotBlank
Интерфейс, который реализует ваша служба
interface FieldValueExists{
@Throws(UnsupportedOperationException::class)
fun fieldValueExists(value: Any, fieldName: String): Boolean
}
Аннотируйте поле вашего идентификатора с помощью приведенного ниже кода
@Unique(message = "data already exists", fieldName = "userGroupID", service UserGroupService::class, serviceQualifier = "userGroupService")
Создание @Unique аннотации
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD,
AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [UniqueValidator::class])
@MustBeDocumented
annotation class Unique(
val message: String = "{unique.value.violation}",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = [],
val service: KClass<out FieldValueExists>,
val serviceQualifier: String = "",
val fieldName: String
)
Создание фактического класса валидатора
class UniqueValidator : ConstraintValidator<Unique, Any> {
@Autowired
private val applicationContext: ApplicationContext? = null
private var service: FieldValueExists? = null
private var fieldName: String? = null
override fun initialize(unique: Unique?) {
val clazz = unique!!.service
this.fieldName = unique.fieldName
val serviceQualifier = unique.serviceQualifier
if (serviceQualifier != "") {
this.service = this.applicationContext!!.getBean(serviceQualifier, clazz) as FieldValueExists?
} else {
this.service = this.applicationContext!!.getBean(clazz)
}
}
override fun isValid(o: Any, constraintValidatorContext: ConstraintValidatorContext): Boolean {
return !this.service!!.fieldValueExists(o, this.fieldName!!)
}
}
И в вашем классе обслуживания реализуйте функцию fieldValueExists () и добавьте следующий код и свою логику
override fun fieldValueExists(value: Any, fieldName: String): Boolean {
//user groupd id should match above fieldName
if (fieldName != "userGroupID") {
throw UnsupportedOperationException("Field name not supported")
}
return groupRepositories.existsById(value as Long)
}
Более подробную информацию можно найти в этомссылка: ссылка