首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于java脚本字符串条件的Graaljs脚本引擎评估

基于java脚本字符串条件的Graaljs脚本引擎评估
EN

Stack Overflow用户
提问于 2020-09-29 18:54:09
回答 1查看 862关注 0票数 0

我正在使用jdk11,graal.js脚本引擎。

我们得到两个json字符串消息,一个有规则/条件(JsRules),另一个有消息。如果消息中的值满足jsRules中的条件,那么它应该计算为1 value 0。

因此,例如,在下面的代码中,字符串"message“具有code: CU_USER,因此是jsRules条件

代码语言:javascript
复制
header.code == 'CU_USER'

应该已经满足了,因此下面的eval应该打印1,但是却给出了0。请解释是什么导致了这种行为,我怎样才能得到想要的行为?

代码语言:javascript
复制
public static void process()
{
    int eval =-2 ;
    String jsRules = "{(header.code == 'CU_USER' || header.subcode == 'SD_CODE')?1:0}";
    String message = "{code:'CU_USER'}";
    
    ScriptEngine graalEngine = new ScriptEngineManager().getEngineByName("Graal.js");
    //graalEngine.put("header",message);
    try {
        graalEngine.eval("var header = unescape(" + message + ")");
        eval = (int)graalEngine.eval(jsRules);
        System.out.println("Eval value::  "+eval);
    } catch (ScriptException e) {
        e.printStackTrace();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-09 10:25:16

您可以调用unescape({code:'CU_USER'}),同时取消转义则需要一个字符串。因此,作为参数提供的对象被转换为字符串(实际上是[object Object] ),因此JavaScript端的header变量包含一个字符串,而不是您预期的对象。

解决方案是简单地删除unescape,即使用graalEngine.eval("var header = " + message);

另一种解决方案是传入Java对象。您似乎已经尝试过使用注释掉的graalEngine.put("header",message);行。请注意,我认为不希望传入Java;您通常希望传入的是一个具有code字段的Java对象。请注意,要使其工作,您需要启用引擎的hostAccess权限(有关更多细节,请查看https://github.com/graalvm/graaljs/blob/master/docs/user/ScriptEngine.md)。

解决办法草案:

代码语言:javascript
复制
public static class MyMessageObj {
  public String code = "CU_USER";
}

ScriptEngine graalEngine = new ScriptEngineManager().getEngineByName("graal.js");
Bindings bindings = graalEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
graalEngine.put("header", new MyMessageObj());
eval = (int) graalEngine.eval(jsRules);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64125905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档