ScriptEngine中的JavaScript是不是谷歌应用程序引擎内工作的Java(GAE /

2019-10-29 13:33发布

我有一个问题,我总是得到一个返回值为0时,我尝试使用,该ScriptEngine的eval。 通过使用记录仪,我能够确定有产生NullPointerException异常。 经进一步检查,似乎GAE并不总是返回一个有效的脚本引擎(如果有的话),因为当你尝试使用它抛出一个异常。

我的代码如下所示:

public double myEval(String JsFormulaStr ) {
    double solutionValue = 0;
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine eng = mgr.getEngineByName("JavaScript");
    if(eng == null) {  // Added this block of code to prevent java.lang.NullPointerException...
        log.severe("Unable to get Script Engine." );
        return 0;
    }
    try {
        Object jsResults = eng.eval(JsFormulaStr);
        solutionValue = Double.parseDouble(jsResults.toString());
        return solutionValue;
    } catch(Exception e) {
        log.severe("[ERROR] in getCalculatedSolution_FromJS_ToDouble()::\n\t" +
                "Formula String is: " + JsFormulaStr + "\n\t" + e);
        return 0;
    }     
}

如果我在本地运行的Web应用程序(无论在Eclipse和Netbeans的。而在Tomcat和Glassfish的4.0),一切工作正常。

其中一些我试图使用eval字符串:

  • 62.0 / 100
  • 0.0 * 352.0
  • (0 - 428)* 1000
  • (0 - 597)* 1000
  • 73.0 / 100

注意:0的或0.0的是从失败的所有以前的调用其他评价。 由于这种功能上的错误返回0。

根据谷歌的JRE类白名单 ,对于ScriptEngineManager ScriptEngine中和类是允许的。 因此,我不明白为什么它无法按预期工作。

有什么建议么?

提前致谢,

兰迪

Answer 1:

我已经打了同样的问题。 虽然类白名单中,这似乎是它们的功能是有限的在App Engine上。 该代码工作正常,你的本地计算机上,但在部署到App Engine在目前还没有任何可用的脚本引擎(因此NullPointerException异常)失败。

幸运的是,你可以使用Rhino引擎同样的事情。

注意:这个例子建立在由戒中的R给出https://stackoverflow.com/a/19828128/578821

下载犀牛罐 ,并添加js.jar到类路径中(如果你使用的是Java 1.4,你只需要JS-14.jar)。

    /* Example 1: Running a JavaScript function (taken from examples) */
    String script = "function abc(x,y) {return x+y;}";
    Context context = Context.enter();
    try {
        ScriptableObject scope = context.initStandardObjects();
        Scriptable that = context.newObject(scope);
        Function fct = context.compileFunction(scope, script, "script", 1, null);
        Object result = fct.call(context, scope, that, new Object[] { 2, 3 });
        System.out.println(Context.jsToJava(result, int.class));
    } 
    finally {
        Context.exit();
    }

    /* Example 2: execute a JavaScript statement */
    script = "3 + 2 * (4*5)";
    context = Context.enter();

    try{
        Scriptable scope = context.initStandardObjects();
        Object result = context.evaluateString(scope, script, "<cmd>", 1, null);
        System.out.println(result);
    }
    finally{
        Context.exit();
    }


文章来源: JavaScript ScriptEngine isn't working within Google App Engine for Java (GAE/J)