【问题标题】:Why the spring ternary expression get reversed result?为什么弹簧三元表达式得到反转的结果?
【发布时间】:2012-08-15 10:44:30
【问题描述】:

我正在阅读 Spring in Action 第 3 版这本书来学习 Spring。

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

它写道:

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

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

如您所见,SpEL 的三元运算符的工作方式与 Java 的相同 三元运算符。在这种情况下,仪器属性将被连接 如果选择的歌曲是“Jingle”,则参考钢琴豆 钟声。”否则,它将与 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)

有什么想法吗?谢谢。

【问题讨论】:

  • 看起来是 JSP 吗?如果是这种情况,请标记为这样。
  • 没有jsp,只是用spring和xml pojo。
  • 如果您从p:song 转换为&lt;property name="song" value="Jingle Bells"/&gt; 会怎样?
  • @EmilSit 结果是一样的。

标签: java spring ternary-operator


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2013-10-15
    • 2019-05-19
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多