我正在通过Spring in Action第3版一书学习Spring。
我正在阅读有关SpEL内部三元表达的部分:
它错了:如果您希望SpEL表达式评估为一个值,该怎么办? 条件是真的,否则不同的值?例如,让我们 说卡尔(早期的乐器演奏家)想要弹钢琴 如果这首歌是“铃儿响叮当”,但他会打萨克斯电话。 在这种情况下,您可以使用SpEL的三元(?:)运算符:
<property name="instrument"
value="#{songSelector.selectSong()=='Jingle Bells'?piano:saxophone}"/>
正如您所看到的,SpEL的三元运算符与Java的运算方式相同 三元运算符。在这种情况下,仪器属性将被连线 如果选择的歌曲是“Jingle”,则引用pianobean 贝尔斯。“否则,它将与IDis萨克斯管的豆子连接。
我用以下xml实现这个:
<bean id="kenny"
class="com.springinaction.springidol.Instrumentalist"
p:song="Jingle Bells">
<property name="instrument"
value="#{kenny.song == 'Jingle Bells' ? piano:saxophone}"/>
</bean>
<bean id="piano"
class="com.springinaction.springidol.Piano" />
<bean id="saxophone"
class="com.springinaction.springidol.Saxophone" />
输出:
播放铃儿响叮当:TOOT TOOT TOOT TOOT
这是不正确的,应该是:
播放铃儿响叮当:PLINK PLINK PINK
我已经检查过测试是使用正确的xml并获得正确的bean,并且乐器的声音是正确的。 (TOOT TOOT TOOT to saxophone和PLINK PLINK PINK for piano)
有什么想法吗?感谢。
答案 0 :(得分:2)
我的猜测是你试图引用一个尚未设置的属性。即使它在XML中的三元表达式中的“引用”之前设置,但很可能在评估SpEL表达式时,尚未设置该属性。请参阅示例this question on Spring setter order。
如果在设置instrument
之前设置了song
,那么您看到的行为就有意义了。
(您可以将日志语句添加到您的setter以确定经验调用顺序。)