2016-08-10 8 views
1

私はフィールドのマッピングを作成して、使いやすい名前からさまざまなドメインオブジェクトのメンバー変数にフィールドをマッピングしようとしています。groovy Evalを使用して生成された式を処理する

class MyClass { 
    Integer amount = 123 
} 

target = new MyClass() 
println "${target.amount}" 

fieldMapping = [ 
    'TUITION' : 'target.amount' 
] 

fieldName = 'TUITION' 
valueSource = '${' + "${fieldMapping[fieldName]}" + '}' 
println valueSource 

value = Eval.me('valueSource') 

評価が失敗した:より大きな文脈では、私は、データベースに格納されたユーザ・構築ルールに基づいてElasticSearchクエリを構築するが、MCVEのためだということです。ここでは出力があります:

123 
${target.amount} 
Caught: groovy.lang.MissingPropertyException: No such property: valueSource for class: Script1 
groovy.lang.MissingPropertyException: No such property: valueSource for class: Script1 
    at Script1.run(Script1.groovy:1) 
    at t.run(t.groovy:17) 

生成された変数名を評価し、値123を返すために必要な何ですか?実際の問題は、valueSourceが定義されていて、実際の式がvalueSourceではないことを認識していないことですが、それも脆くなっている可能性があります。

+0

'evaluate()'はうまくいくかもしれないと思っていますが、これはスクリプトのためのものであり、grailsアプリケーションのコンテキストでは機能しません。 –

+0

評価版の[docs](http://docs.groovy-lang.org/latest/html/api/groovy/util/Eval.html)をご覧ください。これらのメソッドは、呼び出し元のスコープを認識していません。 'valueSource'を利用できるようにするには、' symbol'と 'object'を使って' Eval.me'を呼び出すか、 'x' /' xy'/'xyz'メソッドの一つを呼び出さなければなりません。 – hsan

+0

私はドキュメントを見てきました。ありがとう。 –

答えて

2

あなたはほとんどありますが、少し異なるメカニズム(GroovyShell)を使用する必要があります。 GroovyShellをインスタンス化し、Stringをスクリプトとして評価し、結果を返します。

class MyClass { 
    Integer amount = 123 
} 

target = new MyClass() 

fieldMapping = [ 
     'TUITION' : 'target.amount' 
] 
fieldName = 'TUITION' 

// These are the values made available to the script through the Binding 
args = [target: target] 

// Create the shell with the binding as a parameter 
shell = new GroovyShell(args as Binding) 

// Evaluate the "script", which in this case is just the string "target.amount". 
// Inside the shell, "target" is available because you added it to the shell's binding. 
result = shell.evaluate(fieldMapping[fieldName]) 

assert result == 123 
assert result instanceof Integer 
関連する問題