此驗證程序檢查數據庫中登錄名的唯一性。在第一次檢查時,即當他進入 counterlord 時,一切都很好。但它在保存到數據庫時也有效。但不幸的是,負責檢查登錄唯一性的服務不能@Autowire。問題是什么?是否應該檢查 2 次?class ValidatorUniqueLogin : ConstraintValidator<UniqueLogin, String> { @Autowired val serviceAccaunt: ServiceAccaunt? = null // this null override fun initialize(annotation: UniqueLogin?) {} override fun isValid(login: String, ctx: ConstraintValidatorContext): Boolean { return serviceAccaunt!!.isHaveLogin(login) }}@Documented@Constraint(validatedBy = [ValidatorUniqueLogin::class])@Target(AnnotationTarget.FIELD)@Retention(RetentionPolicy.RUNTIME)annotation class UniqueLogin( val message: String = "{text.error.login.not.unique}", val groups: Array<KClass<*>> = [], val payload: Array<KClass<out Payload>> = [])@Serviceclass ServiceAccaunt(@Autowired val repoAccaunt: RepoAccaunt) { fun isHaveLogin(login: String): Boolean { val count = repoAccaunt.countByLogin(login) return !(count > 0) }}@IsAnonymous @PostMapping("/reg") fun reg( model: Model, @Valid @ModelAttribute("accaunt") accaunt: Accaunt, bindingResult: BindingResult ): String { if (accaunt.roles.isNotEmpty()) { val acessRoles = serviceRole.findRolesForRegistration() for (role: Role in accaunt.roles) if (!acessRoles.contains(role)) accaunt.roles.minus(role) }
1 回答

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
我不明白為什么會這樣,并決定發布第二次驗證。最后,一切正常。為什么spring要驗證幾次我沒看懂,但是我覺得這段代碼在實現上還是挺有效的。
class ValidatorUniqueLogin : ConstraintValidator<UniqueLogin, String> {
@Autowired val serviceAccaunt: ServiceAccaunt? = null
override fun initialize(annotation: UniqueLogin?) {}
override fun isValid(login: String, ctx: ConstraintValidatorContext): Boolean {
return if (serviceAccaunt!= null) !(serviceAccaunt.isHaveLogin(login)) else true
}
}
添加回答
舉報
0/150
提交
取消