你怎么逃避(点)评估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)
答案 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);
这应该允许你按原样运行你的表达式(当然,用引号中的文字)