web-dev-qa-db-ja.com

タイプ 'org.springframework.beans.factory.config.BeanExpressionContextのオブジェクトにフィールドまたはプロパティが見つかりません

次のBean定義:

_<bean id="client" factory-bean="builder"
    factory-method="withConfiguration">
    <constructor-arg type="Java.lang.String"
        value="#{ ${domain} == 'prod' ? 
                Base.${domain}.${realm}.rpt : Base.${domain}.${realm}}" />
_

次のエラーで失敗します:

org.springframework.web.context.ContextLoader: Context initialization failed { org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'test' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'

$ {domain}は「test」と評価する必要があります。構成の何が問題になっていますか?

4

別のリテラルに対してテストし、式の残りの部分でプロパティとして使用しない場合は、プロパティプレースホルダーの結果をliteralにラップする必要があります。

value="#{ '${domain}' == 'prod' ? 
            'Base.${domain}.${realm}.rpt' : 'Base.${domain}.${realm}'}"

私はあなたの編集を受け入れました。ありがとう。

プロパティプレースホルダーはSpELの前に機能するため、プロパティプレースホルダーの結果はSpELの一部になり、実際に有効なものである必要があります。

私は最初の部分を理解しています'${domain}' == 'prod'、別のリテラルと比較するためにPP結果のリテラルが本当に必要な場合。SpELの残りの部分は最初からはっきりしていませんが、今はわかります。 ctorargの場合もStringである必要があります。

それ以外の場合、SpELはtestを、例外で見られる評価コンテキストプロパティとして処理しようとします。

プロパティプレースホルダーなしでSpELを想像してみてください。

6
Artem Bilan

不足しているアポストロフィを追加しなかったため:

th:if = "${user.name} == null";

正しい方法は次のとおりです。

th:if = "'${user.name}' == null";
0
jalon

ブールフィールドの場合は、以下のように ''を使用します

${'offer.isActive'}
0
Nirbhay Rana