为什么弹簧三元表达式得到反转?

时间:2012-08-20 03:27:34

标签: java spring ternary-operator

我正在通过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)

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

我的猜测是你试图引用一个尚未设置的属性。即使它在XML中的三元表达式中的“引用”之前设置,但很可能在评估SpEL表达式时,尚未设置该属性。请参阅示例this question on Spring setter order

如果在设置instrument之前设置了song,那么您看到的行为就有意义了。

(您可以将日志语句添加到您的setter以确定经验调用顺序。)