2014-11-02 70 views
0

我有一個spring bean,我想在其中選擇。Spring 4 SPEL null注入

我想是這樣的:

<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> 

所以 - 如果屬性(由屬性配置器加載)存在,應該是注入值,如果不是也應該注入一個空。

我得到這個異常運行上面:由@博胡斯拉夫 - 瑞光

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) 
+0

我不知道這是否與你的問題有關,但在你的代碼中有'eqauls'而不是'equals'。改變它有幫助嗎? – 2014-11-02 10:18:38

+0

尷尬,因爲我的錯字可能是 - 這不是原因。同樣的錯誤。 – YaOg 2014-11-02 12:23:15

+0

我試圖在一個簡單的項目中重新創建你的代碼,並且我需要做的工作就是引用屬性佔位符,例如:'。但是如果我沒有得到與你的答案不同的異常,那麼可能不會是 – 2014-11-02 13:04:45

回答

3

正如提到的,你需要引用的佔位符。

但是,你必須引用空...

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

...對我來說工作得很好。

編輯:

要回答這個問題在下面的評論,你需要設置ignore-unresolvabletrue的佔位符配置者和測試一個懸而未決的佔位符:

<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被注入。

+0

謝謝。即使'foo'參數根本不存在(並且不僅僅是空的),是否有這種方法可以工作? – YaOg 2014-11-02 14:51:42

+0

我編輯答案顯示了一種方法來做到這一點。 – 2014-11-02 16:02:29