[megoldva] Spring + Nashorn = furcsa java.lang.IllegalStateException: null

Fórumok

Sziasztok,

Belefutottam egy "érdekes" dologba, és nem igazán tudom mihez kezdjek vele. Adott egy JavaScript fájl, amit szeretnék futtatni. A kód így néz ki:


Resource calculatorJs = new UrlResource("http://localhost:8080/scripts/calculator.js");
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
Reader scriptReader = new InputStreamReader(calculatorJs.getInputStream());
engine.eval(scriptReader);

Tökéletesen működik, kivéve, hogy 2 Exception is belekerül a logba (illetve ugyanaz 2x):
java.lang.IllegalStateException: null
at org.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.visitInvokeDynamicInsn(MethodInvokerRewriter.java:997)
at sl.org.objectweb.asm.ClassReader.a(Unknown Source)
at sl.org.objectweb.asm.ClassReader.b(Unknown Source)
at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:332)
at org.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:96)
at org.springsource.loaded.TypeRegistry.methodCallRewriteUseCacheIfAvailable(TypeRegistry.java:830)
at org.springsource.loaded.agent.SpringLoadedPreProcessor.preProcess(SpringLoadedPreProcessor.java:317)
at org.springsource.loaded.agent.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:102)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at jdk.nashorn.internal.runtime.ScriptLoader.installClass(ScriptLoader.java:74)
at jdk.nashorn.internal.runtime.Context$ContextCodeInstaller.install(Context.java:130)
at jdk.nashorn.internal.codegen.Compiler.install(Compiler.java:408)
at jdk.nashorn.internal.codegen.Compiler.install(Compiler.java:447)
at jdk.nashorn.internal.runtime.Context.compile(Context.java:961)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:917)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:406)
at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:608)
at jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:455)
at jdk.nashorn.api.scripting.NashornScriptEngine.(NashornScriptEngine.java:182)
at jdk.nashorn.api.scripting.NashornScriptEngine.(NashornScriptEngine.java:153)
at jdk.nashorn.api.scripting.NashornScriptEngineFactory.getScriptEngine(NashornScriptEngineFactory.java:141)
at javax.script.ScriptEngineManager.getEngineByName(ScriptEngineManager.java:238)

Az elsőt a engineManager.getEngineByName("nashorn"), a másodikat pedig a engine.eval(scriptReader) sor dobja. Kicsit utánnajártam a dolognak, és amikor a NashornScriptEngineFactory.getScriptEngine() adja vissza a NashornScriptEngine, közben kerül bele. Természetesen elkapni nem lehet, hiszen valaki valahol lekezeli a kivételt, csak csúnyálkodik a logban.

A dolog érdekessége, hogy tesztesetem is, annyi különbséggel, hogy abban @Before beállítom az eginet:


ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Reader scriptReader = new InputStreamReader(new FileSystemResource("public/scripts/calculator.js").getInputStream());
engine.eval(scriptReader);

Természetesen így is tökéletesen megy, és logba sem kerül semmi.

Nekem gyanús a kivétel első sora: at org.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.visitInvokeDynamicInsn(MethodInvokerRewriter.java:997) ?? mit keres ott a vezérlés? (amíg ezt olvassátok szerzek Spring sourcet, és meglesem)

Amivel próbálkoztam:
log4j.logger.jdk.nashorn.api.scripting.NashornScriptEngineFactory=FATAL
log4j.logger.jdk.nashorn.api.scripting.NashornScriptEngine=FATAL
log4j.logger.org.springsource.loaded.MethodInvokerRewriter=FATAL

de ezek nem segítettek.

Előre is köszönöm minden hozzászólást.

Hozzászólások

Nekem úgy tűnik spring AOP-t használsz és az kavar be.
Hanyas Javan futtatod (gondolom 8-as)?
Hanyas Javara forditasz (gondolom szinten 8-as)?
Hanyas Springet hasznalsz (4.0, 4.1.RC vagy pre 4)?

Szerintem a Spring verziod nem kompatibilis a Java 8-cal. A stacktracebol latszik, hogy a Spring az asm libet hasznalja class magiahoz, ugyhogy siman lehet, hogy a hasznalt verzio nem erti a Java8 class fejleszteseket.

Nekem úgy tűnik spring AOP-t használsz és az kavar be. - igen
Hanyas Javan futtatod (gondolom 8-as)? - igen
Hanyas Javara forditasz (gondolom szinten 8-as)? - igen
Hanyas Springet hasznalsz (4.0, 4.1.RC vagy pre 4)? - igen (a pontos verziót nem tudom, lastest)

de ha nem érti, hogyan fut le mégis hiba nélkül mindkét esetben? Tehát a Jsben lévő funkciót tudom hívni, és arra nem is dob hibát. Quick research eredményeként nem találtam olyat, hogy !ne használd Java8cal!

Na mindegy, nem előszőr találkozom olyannal, hogy Java lib/fw olyan hibát loggol, ami gyakorlatilag nincs is, és ez amúgy is csak indításkor jön elő, amikor 1x az alkalmazás életében parsolja a js filet.

Köszi

-
Groovy funkcionális eszközök