Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有GraalVM的JavaScript代码中的Java对象是';未定义';_Javascript_Java_Graalvm - Fatal编程技术网

带有GraalVM的JavaScript代码中的Java对象是';未定义';

带有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

我使用GraalVM与JavaScript进行互操作,因为

问题是我的变量在JavaScript运行时是
未定义的

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似乎是个好主意。