Spring 4 SPEL null注入

时间:2014-11-02 09:37:15

标签: spring spring-el

我有一个我想要选择的春天豆。

我试过这样的事情:

    <bean id="springSqlSessionConfigBasedFactory" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="true">
    <property name="dataSource" ref="infraDataSource" />
    <property name="configLocation" value="#{ (!''.eqauls(${myBatis.configLocation})) ? ${myBatis.configLocation} : 'null' }" />
</bean>

所以 - 如果属性(由属性configurer加载)存在,它应该注入该值,如果不存在,它应该注入一个空值。

我得到了这个异常运行上面的内容:

Caused by: java.lang.NullPointerException
at org.springframework.expression.spel.ast.SpelNodeImpl.<init>(SpelNodeImpl.java:54)
at org.springframework.expression.spel.ast.Ternary.<init>(Ternary.java:36)
at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression(InternalSpelExpressionParser.java:136)
at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:85)
at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:56)
at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:32)
at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpressions(TemplateAwareExpressionParser.java:154)
at org.springframework.expression.common.TemplateAwareExpressionParser.parseTemplate(TemplateAwareExpressionParser.java:85)
at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:73)
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:123)

1 个答案:

答案 0 :(得分:3)

如@ bohuslav-burghardt所述,您需要引用占位符。

但是,您必须引用null ...

value="#{!''.equals('${foo}') ? '${foo}' : null}"

......对我来说很好。

编辑:

要回答下面评论中的问题,您需要在占位符配置器上将ignore-unresolvable设置为true并测试未解析的占位符:

<context:property-placeholder properties-ref="props" ignore-unresolvable="true"/>

<bean class="org.springframework.integration.samples.amqp.Foo">
  <property name="foo"
   value="#{(!''.equals('${foo}') AND !'${foo}'.contains('{foo}')) ? '${foo}' : null}" />
</bean>

请注意,它使用contains并省略$以避免替换该参数;否则,一个好的替换将失败该测试并导致注入null。