下面的bean定义:

<bean id="client" factory-bean="builder"
    factory-method="withConfiguration">
    <constructor-arg type="java.lang.String"
        value="#{ ${domain} == 'prod' ?
                Base.${domain}.${realm}.rpt : Base.${domain}.${realm}}" />

失败并显示以下错误:
org.springframework.web.context.ContextLoader: Context initialization failed { org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'test' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
$ {domain}应该评估为“测试”。
配置有什么问题?

最佳答案

如果要对另一个文字进行测试,并且不像在其余表达式中那样将其用作属性,则必须将属性占位符结果包装到literal中:

value="#{ '${domain}' == 'prod' ?
            'Base.${domain}.${realm}.rpt' : 'Base.${domain}.${realm}'}"

我已经接受了您的修改。谢谢。

属性占位符在SpEL之前起作用,因此,任何属性占位符结果都成为SpEL的一部分,它实际上必须是有效的。

我理解第一部分'${domain}' == 'prod',当您确实必须有一个用于PP结果的文字才能将其与另一个文字进行比较时。从一开始我对您的SpEL的其余部分还不清楚,但现在我发现对于ctor arg来说,它也应该是String

否则,SpEL会尝试将test视为某些评估上下文属性,这是我们在异常中看到的。

试想一下您的SpEL没有属性(property)占位符。

10-06 05:12