基于 Kotlin 协程的 Spring EL 评估失败

问题描述 投票:0回答:1

给定一个这样的接口和实现类。

interface MyBean{
   suspend fun suspend isEnabled(name:String): Boolean
}

@Service("myBean")
@NoArg // I created an annotation and configured the noarg plugin 
//to satisfy Spring EL's `noarg default constructor` requirements.
class MyMbean(val antoherBean: AnotherBean): MyBean{

   override suspend fun isEnabled(name:String): Boolean{
   }
}

像这样将其涂抹在

@ConditonalOnExpression
上时。

@Configuration
@ConditionalOnExpression("#myBean.isEnabled('test')")
class MyConfig{}

对于 EL 字符串,我尝试过

#{myBean.isEnabled('test')}
等,但没有成功。

EL1008E: Property or field 'myBean' cannot be found on object of type 
'org.springframework.beans.factory.config.BeanExpressionContext'
 - maybe not public or not valid?

我使用的是最新的 Spring Boot 3.3.1 和 Kotlin 2.0.0/Kotlin Coroutines 1.8.x。

更新:我尝试删除

suspend
修饰符,但仍然遇到失败。

spring-boot spring-webflux kotlin-coroutines spring-el
1个回答
0
投票

我们通常使用

@Configuration
注释作为定义“核心”bean 的地方。

然后使用

@Component
(或
@Service
@Repository
)注释来定义使用“核心”bean 的“特定”bean。

这就是为什么

MyConfig
会在
MyMbean
之前初始化。

如果你想尝试这样做。你必须自定义自己的条件并手动创建bean:

@Configuration
@Conditional(MyBeanCondition.class)
public class MyConfig {}

public class MyBeanCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        MyBean mybean = context.getBeanFactory().createBean(MyMbean.class);
        return mybean.isEnabled("test");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.