Spring 不创建 ConstraintValidator
Spring does not create ConstraintValidator
Spring 不会创建实施 ConstraintValidator
的 class 的实例。
即使我用 @Configuartion
Spring 注释 RolesValidator
创建它的实例,但验证不起作用。
这是我的代码:
@Constraint(validatedBy = [RolesValidator::class])
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class ValidateRoles(
val message: String = "{com.app.authservice.validators.ValidateRoles.message}",
val groups: Array<KClass<*>> = arrayOf(),
val payload: Array<KClass<out Payload>> = arrayOf()
)
//------Validator------
class RolesValidator : ConstraintValidator<ValidateRoles, Collection<String>> {
lateinit var allowedValues: List<String>
override fun initialize(constraintAnnotation: ValidateRoles?) {
allowedValues = RoleType.values().map { it.name }
}
override fun isValid(value: Collection<String>?, context: ConstraintValidatorContext?): Boolean {
return allowedValues.containsAll(value!!)
}
}
//------Usage------
class AccountUpdateRolesDTO {
@NotNull
@ValidateRoles
var roles: Set<String> = emptySet()
}
//------Controller------
@PreAuthorize("hasAnyAuthority($_ADMIN)")
@Transactional
@PutMapping("/{accountId}/roles")
fun updateRoles(
@RequestBody @Valid body: AccountUpdateRolesDTO,
@PathVariable accountId: Long,
jwt: JWTData
): ResponseEntity<Void> {
return ResponseEntity(HttpStatus.OK)
}
Spring 似乎无法识别 Kotlin 中的注解。在我将注释转换为 Java 之后一切正常。
@Constraint(validatedBy = RolesValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ValidateRoles {
String message() default "{com.app.authservice.validators.ValidateRoles.message}";
Class[] groups() default {};
Class[] payload() default {};
}
如果您利用 annotation use-site targets,Kotlin 测试也会通过:
class KotlinBodyDTO {
@field:NotNull
@field:ValidateRolesKotlin
var roles: Set<String> = emptySet()
}
Spring 不会创建实施 ConstraintValidator
的 class 的实例。
即使我用 @Configuartion
Spring 注释 RolesValidator
创建它的实例,但验证不起作用。
这是我的代码:
@Constraint(validatedBy = [RolesValidator::class])
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class ValidateRoles(
val message: String = "{com.app.authservice.validators.ValidateRoles.message}",
val groups: Array<KClass<*>> = arrayOf(),
val payload: Array<KClass<out Payload>> = arrayOf()
)
//------Validator------
class RolesValidator : ConstraintValidator<ValidateRoles, Collection<String>> {
lateinit var allowedValues: List<String>
override fun initialize(constraintAnnotation: ValidateRoles?) {
allowedValues = RoleType.values().map { it.name }
}
override fun isValid(value: Collection<String>?, context: ConstraintValidatorContext?): Boolean {
return allowedValues.containsAll(value!!)
}
}
//------Usage------
class AccountUpdateRolesDTO {
@NotNull
@ValidateRoles
var roles: Set<String> = emptySet()
}
//------Controller------
@PreAuthorize("hasAnyAuthority($_ADMIN)")
@Transactional
@PutMapping("/{accountId}/roles")
fun updateRoles(
@RequestBody @Valid body: AccountUpdateRolesDTO,
@PathVariable accountId: Long,
jwt: JWTData
): ResponseEntity<Void> {
return ResponseEntity(HttpStatus.OK)
}
Spring 似乎无法识别 Kotlin 中的注解。在我将注释转换为 Java 之后一切正常。
@Constraint(validatedBy = RolesValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ValidateRoles {
String message() default "{com.app.authservice.validators.ValidateRoles.message}";
Class[] groups() default {};
Class[] payload() default {};
}
如果您利用 annotation use-site targets,Kotlin 测试也会通过:
class KotlinBodyDTO {
@field:NotNull
@field:ValidateRolesKotlin
var roles: Set<String> = emptySet()
}