从java中的groovy表达式绑定中转义点

时间:2018-06-18 12:47:35

标签: java groovy

你怎么逃避(点)评估GroovyShell中的绑定? 似乎评估者无法处理。

import groovy.lang.GroovyShell;
import groovy.lang.Binding; 
public class BindingSample {
    public static void main(String[] args) {
        String expression = "sample.name == ben ||  sample.name == mark || sample.name == trae";

        Binding binding = new Binding();
        binding.setVariable("sample.name", "ben");
        GroovyShell shell = new GroovyShell(binding);
        Object result = shell.evaluate(expression);
        System.out.println(result);
    }
}

Exception in thread "main" groovy.lang.MissingPropertyException: No such property: sample for class: Script1
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
    at Script1.run(Script1.groovy:1)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
    at templates.postprocess.BindingSample.main(BindingSample.java:23)

1 个答案:

答案 0 :(得分:1)

您不能,也可能不应该尝试“转义”变量标识符中的点。这是因为当脚本引用sample.name时,Groovy将尝试读取名为name的变量中对象的sample属性。

如果您确实(真的)需要使用该标识符,那么您可能应该直接使用getProperty,尽管这不应该在普通的脚本代码中完成...以下工作:

String expression = "getProperty('sample.name') == 'ben' ||  getProperty('sample.name') == 'mark' || getProperty('sample.name') == 'trae'";

另请注意,您的比较不引用字符串文字,这是该表达式失败的另一个原因。

您还有另一种方法,即使用地图:

Map<String, String> m = new HashMap<>();
m.put("name", "ben");
binding.setVariable("sample", m);

这应该允许你按原样运行你的表达式(当然,用引号中的文字)