带有GraalVM的JavaScript代码中的Java对象是';未定义';
我使用GraalVM与JavaScript进行互操作,因为 问题是我的变量在JavaScript运行时是带有GraalVM的JavaScript代码中的Java对象是';未定义';,javascript,java,graalvm,Javascript,Java,Graalvm,我使用GraalVM与JavaScript进行互操作,因为 问题是我的变量在JavaScript运行时是未定义的 ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js"); String path = "rules.js"; InputStream is = Main.class.getClassLoader().getResourceAsStream(path); Reader reader = ne
未定义的
ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");
String path = "rules.js";
InputStream is = Main.class.getClassLoader().getResourceAsStream(path);
Reader reader = new InputStreamReader(is);
engine.eval(reader);
Invocable inv = (Invocable) engine;
Object obj = engine.get("obj");
User user = new User();
user.setName("username");
user.setProfile("admin");
Boolean value = (Boolean) inv.invokeMethod(obj, "validatePermission", user);
这是我正在运行的JavaScript代码:
var obj = new Object();
obj.validatePermission = function(user) {
console.log(user.profile)
if(user.profile === 'admin') {
return true;
} else {
throw 'Unauthorized. User must be administrator.';
}
}
POM依赖项:
<project>
<properties>
<graalvm.version>19.0.0</graalvm.version>
</properties>
<dependencies>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js-scriptengine</artifactId>
<version>${graalvm.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.truffle</groupId>
<artifactId>truffle-api</artifactId>
<version>${graalvm.version}</version>
</dependency>
</dependencies>
</project>
19.0.0
org.graalvm.js
js
${graalvm.version}
org.graalvm.js
js脚本引擎
${graalvm.version}
org.graalvm.truffle
松露原料药
${graalvm.version}
设置Nashorn兼容模式解决了这个问题
System.setProperty("polyglot.js.nashorn-compat", "true");
有关此处的详细信息:
以上所有信息均由GraalVM团队提供。请注意,您可以在部署中包括nashorn。那么你就不依赖JVM了。@Thorbjørnravandersen不理解你的评论。我让它与纳肖德一起工作,但它应该被弃用。什么意思?Nashorn已被Oracle弃用,将从JDK发行版中删除。这并不禁止您在自己的应用程序中包含Nashorn的副本(就像您使用的任何其他依赖项一样),甚至在Java的新版本上也可以使用它。@Thorbjørnravandersen-hmmm-gotcha,我假设是这样的。我在Maven上搜索了Nashorn发行版,但没有找到。我的猜测是Nashorn还没有被弃用,所以它还没有迁移到社区?Nashorn正在被弃用,因为它落后于更新的ECMAScript。如果有人站出来维护它,它就不会被移除。它没有得到维护这一事实意味着您可能不想发布它,除非您正在维护一些长期受支持的遗留软件。graalvm声称支持较新的ECMAScript 2018,并表示将支持2019年,届时它将不再是草稿。因此,升级到“graal.js”并退回到nashorn似乎是个好主意。