Graaljs 脚本引擎评估 java 脚本字符串条件
Graaljs script engine evaluate on java script string condition
我正在使用 jdk11,graal.js 脚本引擎。
我们得到两条 json 字符串消息,一条有 rules/condition(jsRules) ,另一条有消息。如果 message 中的值满足 jsRules 中的条件,它应该评估为 1 else 0 .
因此,例如在下面的代码中,字符串“消息”具有 code: CU_USER
因此 jsRules 条件
header.code == 'CU_USER'
应该已经满足,因此下面的 eval 应该打印 1,但它给出了 0。请解释导致此行为的原因以及如何获得所需的行为? .
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();
}
}
您调用 unescape({code:'CU_USER'})
而 unescape 需要一个字符串。因此,您作为参数提供的对象被转换为字符串(实际上转换为 [object Object]
),因此 Java 脚本端的 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)。
解决方案草稿:
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);
我正在使用 jdk11,graal.js 脚本引擎。
我们得到两条 json 字符串消息,一条有 rules/condition(jsRules) ,另一条有消息。如果 message 中的值满足 jsRules 中的条件,它应该评估为 1 else 0 .
因此,例如在下面的代码中,字符串“消息”具有 code: CU_USER
因此 jsRules 条件
header.code == 'CU_USER'
应该已经满足,因此下面的 eval 应该打印 1,但它给出了 0。请解释导致此行为的原因以及如何获得所需的行为? .
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();
}
}
您调用 unescape({code:'CU_USER'})
而 unescape 需要一个字符串。因此,您作为参数提供的对象被转换为字符串(实际上转换为 [object Object]
),因此 Java 脚本端的 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)。
解决方案草稿:
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);