0

Spring in Action 3rd editionという本でSpringを学んでいます。

SpEL 内の三項式に関するセクションまで読んでいます。

それは書いています:

条件が true の場合は SpELexpression を 1 つの値に評価し、それ以外の場合は別の値に評価する場合はどうすればよいでしょうか? たとえば、カール (前のインストゥルメンタリスト) が「ジングル ベル」の場合はピアノを弾きたいとしますが、それ以外の場合はサックスを演奏します。その場合、SpEL の三項 (?:) 演算子を使用できます。

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

ご覧のとおり、SpEL の三項演算子は Java の三項演算子と同じように機能します。この場合、選択された曲が「ジングル ベル」であれば、インストゥルメント プロパティはピアノビーンを参照して配線されます。それ以外の場合は、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" />

出力:

ジングルベルの演奏:TOOT TOOT TOOT

これは正しくありません。次のようにする必要があります。

ジングルベルの演奏:PLINK PLINK PINK

テストで正しい xml が使用され、正しい Bean が取得されていること、および楽器の音が正しいことを確認しました。(サックスはTOOT TOOT TOOT、ピアノはPLINK PLINK PINK)

何か案が?ありがとう。

4

1 に答える 1

2

私の推測では、まだ設定されていないプロパティを参照しようとしていると思います。XMLの3項式の参照の「前」に設定されていても、SpEL式が評価されている時点では、プロパティがまだ設定されていない可能性があります。たとえば、Springセッターの注文に関するこの質問を参照してください。

instrumentが設定される前に設定されている場合song、表示されている動作は理にかなっています。

(ログステートメントをセッターに追加して、経験的な呼び出し順序を決定できます。)

于 2012-08-20T14:50:29.477 に答える