Spring не создает ConstraintValidator

avatar
Humberd
7 апреля 2018 в 22:38
699
2
1

Spring не создает экземпляр класса, реализующего ConstraintValidator. Даже когда я комментирую RolesValidator с помощью @Configuartion, Spring создает свой экземпляр, но проверка не работает.

Вот мой код:

@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)
}

@edit https://jira.spring.io/browse/SPR-16701

Источник
asm0dey
8 апреля 2018 в 04:32
0

Видите ли вы какие-либо исключения в журнале? Как вы теперь, что это не создано?

Humberd
8 апреля 2018 в 08:56
0

Я устанавливаю точку останова в валидаторе, и она никогда не вызывается и не инициализируется. И нет, никаких исключений

Ответы (2)

avatar
Sébastien Deleuze
9 апреля 2018 в 08:41
1

Если вы используете аннотацию use-site target, тесты Kotlin также проходят:

class KotlinBodyDTO {
    @field:NotNull
    @field:ValidateRolesKotlin
    var roles: Set<String> = emptySet()
}
avatar
Humberd
8 апреля 2018 в 09:45
0

Похоже, 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 {};
}