如何使用 Spring SPEL 解析动态 属性 名称?

How to resolve dynamic property name using Spring SPEL?

我有一个实例变量,其值应通过查找动态 属性 名称来设置。

Class Test {
    @Value("#{T(java.lang.String).format('filter.%s.disable', getClass().getSimpleName())}")
    private boolean disable;
}

disable 应在 filter.Test.disable = true 时计算为 true,否则为 false。如果未定义 属性,我还想设置默认值 false,这通常使用以下语法完成,但在这种情况下我不确定。 @Value("${property:default}")

我遇到错误:

Caused by: java.lang.IllegalArgumentException: Invalid boolean value [filter.BeanExpressionContext.disable]

还尝试了 @Value("${'dcs.cloud.filter.'#{getClass().getSimpleName()}'.disable'}") 以及 #$ 的一些其他组合,但均无济于事。

SPEL doc 显示无用的 parser.parseExpression 调用来评估表达式,它使用不同的语法,而实际上没有人这样做。看起来他们是从单元测试中挑选代码而不是实际示例。

您无法访问以这种方式声明表达式的 class。 getClass() 作用于表达式求值的根对象(在本例中为 BeanExpressionContext)。

不清楚为什么你不能在这里使用 filter.Test.disable(除非,当 Test 是 subclass 时你可能试图获得实际的 class编辑).

你不能那样做。

通过从环境中获取 属性 来实现 EnvironmentAware 和设置布尔值可能更容易。