ScriptEngine eval を使用しようとすると、常に 0 の値が返されるという問題があります。Logger を使用することで、NullPointerExceptions が生成されていることを確認できました。さらに調べてみると、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;
}
}
WebApp としてローカルで実行すると、すべて正常に動作します (Eclipse と Netbeans の両方で、Tomcat と Glassfish 4.0 内で)。
私が評価しようとした文字列のいくつか:
- 62.0 / 100
- 0.0 * 352.0
- (0 - 428) * 1000
- (0 - 597) * 1000
- 73.0 / 100
注: 0 または 0.0 は、以前の呼び出しで失敗した他の評価からのものです。この関数はエラー時に 0 を返すため。
Google の JRE Class Whitelistによると、ScriptEngineManager および ScriptEngine クラスが許可されています。そのため、なぜ期待どおりに機能しないのかわかりません。
助言がありますか?
前もって感謝します、
ランディ