0

我遇到一个问题,当我尝试使用ScriptEngine eval时,总会得到0值。通过使用Logger,我可以确定有NullPointerExceptions正在生成。进一步检查之后,看起来GAE并不总是返回有效的脚本引擎(如果曾经),因为它在尝试使用它时会引发异常。JavaScript ScriptEngine在Google App Engine for Java(GAE/J)中不工作

我的代码是这样的:如果我在本地运行的Web应用程序

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; 
    }  
} 

一切工作正常(无论是在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的是从已经失败的I其他评价之前的电话。由于该函数在出错时返回0。

根据Google's JRE Class Whitelist,ScriptEngineManager和ScriptEngine类是允许的。所以我不明白为什么它没有按预期工作。

有什么建议吗?

由于提前,

兰迪

回答

0

我已经打了同样的问题。尽管这些类已列入白名单,但它们的功能似乎在App Engine上受到限制。该代码在本地机器上正常工作,但在部署到App Engine时失败,因为没有任何脚本引擎可用(因此为NullPointerException)。

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

注:本例是基于对在https://stackoverflow.com/a/19828128/578821

由戒式给出:R下载Rhino Jar并添加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(); 
    } 
相关问题