在类型' org.springframework.beans.factory.config.BeanExpressionContext的对象上找不到字段或属性

时间:2014-08-31 16:17:52

标签: java spring spring-el

以下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} 应评估为&#39; test&#39;。 配置有什么问题?

3 个答案:

答案 0 :(得分:6)

你的属性占位符结果必须包装到literal,如果你要针对另一个文字进行测试,并且不要像你在表达式的其余部分那样使用它作为属性:

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

我接受了你的编辑。谢谢。

属性占位符在SpEL之前工作,因此,任何属性占位符结果都会成为某个SpEL部分,并且它必须是有效的。

我理解第一部分'${domain}' == 'prod',当你真的必须有一个PP结果的文字来比较它与另一个文字。你的SpEL的其余部分从一开始就不清楚,但是现在我发现它对于ctor arg也应该是String

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

尝试设想没有属性占位符的SpEL。

答案 1 :(得分:0)

因为我没有添加缺少的撇号:

th:if = "${user.name} == null";

正确的方法是:

th:if = "'${user.name}' == null";

答案 2 :(得分:0)

对于布尔字段,使用''如下所示

${'offer.isActive'}