【问题标题】:How to resolve dynamic property name using Spring SPEL?如何使用 Spring SPEL 解析动态属性名称?
【发布时间】:2017-08-01 09:42:49
【问题描述】:

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

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}")

我收到了错误:

原因:java.lang.IllegalArgumentException:无效的布尔值 [filter.BeanExpressionContext.disable]

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

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

【问题讨论】:

    标签: spring spring-el


    【解决方案1】:

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

    不清楚为什么你不能在这里只使用filter.Test.disable(除非,当Test 被子类化时,你可能试图获取实际的类)。

    你不能这样做。

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

    【讨论】:

    • 我就是这样做的,注入Environment 并查找值。我不想硬编码类名,因为 a) 重构会破坏它 b) 不适用于子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2023-03-14
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多