【问题标题】:Escaping the dot in groovy expression binding from java从java中转义groovy表达式绑定中的点
【发布时间】:2018-11-27 07:48:33
【问题描述】:

你如何逃脱。 (点)评估 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)

【问题讨论】:

    标签: java groovy


    【解决方案1】:

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

    如果你真的(真的)需要使用那个标识符,那么也许你应该直接使用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);
    

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

    【讨论】:

    • 在使用地图的替代方案中......我还需要添加 getProperty 吗?我没有在我的表达式中添加 getProperty,我遇到了同样的错误。
    • @MarkEstrada 否。如前所述,您可以使用原始表达式(只需确保引用字符串文字:'ben'、'mark'、'trae'...)跨度>
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多