【问题标题】:Spring does not create ConstraintValidatorSpring 不创建 ConstraintValidator
【发布时间】:2018-04-07 22:38:00
【问题描述】:

Spring 不会创建实现ConstraintValidator 的类的实例。 即使我用@Configuartion 注释RolesValidator,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)
}

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

【问题讨论】:

  • 您在日志中看到任何异常吗?没有创建的你现在怎么办?
  • 我在验证器中设置了一个断点,它从未被调用或初始化。不,没有例外

标签: java spring kotlin bean-validation


【解决方案1】:

如果您利用 annotation use-site targets,Kotlin 测试也可以通过:

class KotlinBodyDTO {
    @field:NotNull
    @field:ValidateRolesKotlin
    var roles: Set<String> = emptySet()
}

【讨论】:

    【解决方案2】:

    似乎 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 {};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      相关资源
      最近更新 更多