rhino的ScriptContext在用于任何JavaScript日期函数时引发异常
如果我尝试直接计算javascript日期函数,它的工作原理如下:rhino的ScriptContext在用于任何JavaScript日期函数时引发异常,javascript,java,rhino,Javascript,Java,Rhino,如果我尝试直接计算javascript日期函数,它的工作原理如下: ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine engine = m.getEngineByName("rhino"); String script = "new Date().getUTCMonth()"; System.out.println(engine.eval(script)); 但是,如果我尝试使用ScriptContext对象,
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine engine = m.getEngineByName("rhino");
String script = "new Date().getUTCMonth()";
System.out.println(engine.eval(script));
但是,如果我尝试使用ScriptContext对象,那么eval方法会出现异常。
下面是代码片段
ScriptContext context1 = new SimpleScriptContext();
context1.setAttribute("temp", new Date(), ScriptContext.ENGINE_SCOPE);
String scriptUtcMonth = "temp.getUTCMonth()";
System.out.println(engine.eval(scriptUtcMonth,context1));
例外情况是:
Exception in thread "main" com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: TypeError: Cannot find function getUTCMonth in object Thu Nov 26 13:54:01 IST 2015. (<Unknown source>#1) in <Unknown source> at line number 1
at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:184)
at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:198)
at test.class1.main(class1.java:40)
Caused by: org.mozilla.javascript.EcmaError: TypeError: Cannot find function getUTCMonth in object Thu Nov 26 13:54:01 IST 2015. (<Unknown source>#1)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3693)
at org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3712)
at org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:3783)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2269)
at org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2251)
at org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java:83)
at org.mozilla.javascript.gen._Unknown_source__11._c_script_0(<Unknown source>:1)
at org.mozilla.javascript.gen._Unknown_source__11.call(<Unknown source>)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen._Unknown_source__11.call(<Unknown source>)
at org.mozilla.javascript.gen._Unknown_source__11.exec(<Unknown source>)
at org.mozilla.javascript.Context.evaluateReader(Context.java:1110)
at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:172)
... 2 more
线程“main”com.sun.phobos.script.util.ExtendedScriptException:org.mozilla.javascript.EcmaError:TypeError:在对象中找不到函数getUTCMonth Thu Nov 26 13:54:01 IST 2015。(#1)在第1行
位于com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:184)
位于com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:198)
在test.class1.main中(class1.java:40)
原因:org.mozilla.javascript.EcmaError:TypeError:在对象中找不到函数getUTCMonth Thu Nov 26 13:54:01 IST 2015。(#1)
位于org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
位于org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
位于org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3693)
位于org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3712)
位于org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:3783)
位于org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2269)
位于org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2251)
位于org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java:83)
在org.mozilla.javascript.gen._Unknown_source_11._c_script_0(:1)
在org.mozilla.javascript.gen._Unknown_source_uu11.call()上
位于org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
位于org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
在org.mozilla.javascript.gen._Unknown_source_uu11.call()上
在org.mozilla.javascript.gen._Unknown_source_uu11.exec()上
位于org.mozilla.javascript.Context.evaluateReader(Context.java:1110)
位于com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:172)
... 还有两个
A
java.util.Date
不会自动转换为JavaScriptDate
。所有从Java传递到JavaScript的对象都是直接访问的,因此它保持为Java.util.Date
,而Java.util.Date
没有getUTCMonth()
方法。谢谢Andreas,我理解你的观点。那么,使用rhino计算javascript日期函数的可行方法是什么呢?最简单的方法是使用javascript:newdate(temp.getTime()).getUTCMonth()
。在纳肖恩身上测试过,在犀牛身上也应该是一样的。。谢谢安德烈亚斯:)