Spring boot 如何从SpEL调用反应bean方法?
我有一个这样的豆子:Spring boot 如何从SpEL调用反应bean方法?,spring-boot,spring-security,Spring Boot,Spring Security,我有一个这样的豆子: @Configuration class ActionsSecurity(val actionRepository: ActionRepository) { @Bean fun actionsPermissions(): ActionsSecurity { return this } @Suppress("unused") // used in SpEL fun ownsAction(actionId: Long, use
@Configuration
class ActionsSecurity(val actionRepository: ActionRepository) {
@Bean
fun actionsPermissions(): ActionsSecurity {
return this
}
@Suppress("unused") // used in SpEL
fun ownsAction(actionId: Long, user: CurrentUser): Boolean {
return runBlocking { actionRepository.findById(actionId)?.userId == user.id }
}
}
它运行一个阻塞DB操作,以查找当前用户是否拥有该操作。它用于服务方法:
@PreAuthorize("@actionsPermissions.ownsAction(#actionId[0], authentication)")
suspend fun delete(actionId: Long)
这正如预期的那样有效。当然,阻止线程不是好主意因此我尝试使自己的操作
挂起:
@Suppress("unused") // used in SpEL
suspend fun ownsAction(actionId: Long, user: CurrentUser): Boolean {
return actionRepository.findById(actionId)?.userId == user.id
}
但这在以下方面失败:
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method ownsAction(java.lang.Long,com.example.core.CurrentUser) cannot be found on type com.example.actions.ActionsSecurity$$EnhancerBySpringCGLIB$$e99c9096
我知道我可以在SpEL上下文本身上实现一个扩展,但是不能在bean上使用反应式方法感觉很麻烦?我们真的不能吗
更新
不可能,自2017年以来存在一个未决问题: