J'ai utilisé le code suivant avec le moteur JavaScript Rhino
en Java:variable d'accès de scriptContext à l'aide Nashorn JavaScript Engine (Java 8)
@Test
public void testRhino() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("rhino");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
La sortie du script (en utilisant Rhino
) est:
I am the raw value injected
I am a result
I am a returned value
dans le moteur JavaScript Nashorn
, je reçois pas de valeur pour le result
:
@Test
public void testNashorn() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("nashorn");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
retours
I am the raw value injected
null
I am a returned value
Comment puis-je accéder à la valeur de la variable result
du ScriptContext
en utilisant le moteur nashorn
?
'NashornScriptEngine # createBindings()' renvoie soit 'new SimpleBindings()', si global-per-engine est défini, soit 'createGlobalMirror()' s'il n'est pas défini. Exécution avec '-Dnashorn.args = - global-per-engine', ou en ajoutant la ligne' System.setProperty ("nashorn.args", "--global-per-engine"); 'avant la création du moteur , provoquera 'ctx.getAttribute (" result ")' pour retourner 'null'. Travailler autour du global de Nashorn est l'une des plus grandes difficultés dans l'intégration de Nashorn dans une application Java. – AJNeufeld