0

我正在通过 Spring in Action 第 3 版这本书学习 Spring。

我正在阅读关于 SpEL 中的三元表达式的部分:

它写道:

如果您希望 SpEL 表达式在条件为真时计算为一个值,否则为不同的值怎么办?例如,假设如果歌曲是“铃儿响叮当”,卡尔(前面的乐器演奏家)想弹钢琴,否则他会弹萨克斯管。在这种情况下,您可以使用 SpEL 的三元 (?:) 运算符:

 <property name="instrument"
 value="#{songSelector.selectSong()=='Jingle Bells'?piano:saxophone}"/>

如您所见,SpEL 的三元运算符的工作方式与 Java 的三元运算符相同。在这种情况下,如果所选歌曲是“Jingle Bells”,则乐器属性将与钢琴豆的参考相关联。否则,它将与 IDis 萨克斯管的 bean 连接。

我使用以下 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" />

输出:

演奏铃儿响叮当:嘟嘟嘟

这是不正确的,应该是:

演奏铃儿响叮当:PLINK PLINK PINK

我检查了测试是否使用了正确的 xml 并获得了正确的 bean,并且仪器的声音是正确的。(TOOT TOOT TOOT 用于萨克斯管,PLINK PLINK PINK 用于钢琴)

任何想法?谢谢。

4

1 回答 1

2

我的猜测是您正在尝试引用尚未设置的属性。即使它是在 XML 中的三元表达式中的引用“之前”设置的,但很可能在评估 SpEL 表达式时,该属性尚未设置。例如,请参阅Spring setter order 上的这个问题

如果instrument在设置之前song设置,则您看到的行为是有意义的。

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

于 2012-08-20T14:50:29.477 回答