-
-
Notifications
You must be signed in to change notification settings - Fork 942
Description
Environment Information
- jruby 9.4.6.0 (3.1.4) 2024-02-20 576fab2 OpenJDK 64-Bit Server VM 17.0.10+7 on 17.0.10+7 +jit [x86_64-darwin]
- Darwin MacBook-Pro.home 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:12:49 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6020 arm64
This occurs inside a Spring Boot application using SLIM as a view template engine. The general setup is handled by https://github.com/DatekWireless/slim-spring-webmvc
We run a web crawler against our app, and most requests work fine, but intermittent requests produce an exception:
Java::JavaLang::ClassCastException: class org.jruby.java.proxies.ConcreteJavaProxy cannot be cast to class org.jruby.RubyArray (org.jruby.java.proxies.ConcreteJavaProxy and org.jruby.RubyArray are in unnamed module of loader 'app')
Stack trace:
org.jruby.embed.variable.Argv.getJavaObject(org/jruby/embed/variable/Argv.java:199)
org.jruby.embed.internal.BiVariableMap.get(org/jruby/embed/internal/BiVariableMap.java:230)
org.jruby.embed.internal.BiVariableMap.get(org/jruby/embed/internal/BiVariableMap.java:209)
org.jruby.embed.jsr223.Utils.postEval(org/jruby/embed/jsr223/Utils.java:198)
org.jruby.embed.jsr223.JRubyEngine.invokeMethod(org/jruby/embed/jsr223/JRubyEngine.java:229)
org.springframework.web.servlet.view.script.ScriptTemplateView.renderMergedOutputModel(org/springframework/web/servlet/view/script/ScriptTemplateView.java:426)
org.springframework.web.servlet.view.AbstractView.render(org/springframework/web/servlet/view/AbstractView.java:316)
jdk.internal.reflect.GeneratedMethodAccessor254.invoke(jdk/internal/reflect/GeneratedMethodAccessor254)
jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(jdk/internal/reflect/DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:568)
org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(org/jruby/javasupport/JavaMethod.java:345)
org.jruby.javasupport.JavaMethod.invokeDirect(org/jruby/javasupport/JavaMethod.java:200)
uri_3a_classloader_3a_.ruby.slim_helper.invokeOther35:render(uri_3a_classloader_3a_/ruby/uri:classloader:/ruby/slim_helper.rb:27)
uri_3a_classloader_3a_.ruby.slim_helper.render(uri:classloader:/ruby/slim_helper.rb:27)
views.layouts.layout_dot_slim.invokeOther20:render(views/layouts//views/layouts/layout.slim:13)
views.layouts.layout_dot_slim.__tilt_4004(/views/layouts/layout.slim:13)
org.jruby.RubyUnboundMethod.bind_call(org/jruby/RubyUnboundMethod.java:169)
org.jruby.RubyUnboundMethod$INVOKER$i$0$0$bind_call.call(org/jruby/RubyUnboundMethod$INVOKER$i$0$0$bind_call.gen)
uri_3a_classloader_3a_.gems.tilt.template.invokeOther12:bind_call(uri_3a_classloader_3a_/gems/tilt/uri:classloader:/gems/tilt/template.rb:191)
uri_3a_classloader_3a_.gems.tilt.template.evaluate(uri:classloader:/gems/tilt/template.rb:191)
uri_3a_classloader_3a_.gems.tilt.template.invokeOther5:evaluate(uri_3a_classloader_3a_/gems/tilt/uri:classloader:/gems/tilt/template.rb:109)
uri_3a_classloader_3a_.gems.tilt.template.render(uri:classloader:/gems/tilt/template.rb:109)
uri_3a_classloader_3a_.ruby.slim_renderer.invokeOther60:render(uri_3a_classloader_3a_/ruby/uri:classloader:/ruby/slim_renderer.rb:89)
uri_3a_classloader_3a_.ruby.slim_renderer.render_slim(uri:classloader:/ruby/slim_renderer.rb:89)
org.jruby.RubyClass.finvokeWithRefinements(org/jruby/RubyClass.java:540)
org.jruby.RubyClass.finvoke(org/jruby/RubyClass.java:528)
org.jruby.embed.internal.EmbedRubyObjectAdapterImpl.doInvokeMethod(org/jruby/embed/internal/EmbedRubyObjectAdapterImpl.java:240)
org.jruby.embed.internal.EmbedRubyObjectAdapterImpl.callMethod(org/jruby/embed/internal/EmbedRubyObjectAdapterImpl.java:160)
org.jruby.embed.ScriptingContainer.callMethod(org/jruby/embed/ScriptingContainer.java:1464)
org.jruby.embed.jsr223.JRubyEngine.invokeMethod(org/jruby/embed/jsr223/JRubyEngine.java:221)
org.springframework.web.servlet.view.script.ScriptTemplateView.renderMergedOutputModel(org/springframework/web/servlet/view/script/ScriptTemplateView.java:426)
org.springframework.web.servlet.view.AbstractView.render(org/springframework/web/servlet/view/AbstractView.java:316)
org.springframework.web.servlet.DispatcherServlet.render(org/springframework/web/servlet/DispatcherServlet.java:1406)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(org/springframework/web/servlet/DispatcherServlet.java:1150)
The guilty line (org/jruby/embed/variable/Argv.java:199) contains a cast to org.jruby.RubyArray, and an inspection in IntelliJ IDEA shows rubyObject is a RubyArray object, but still the ClassCastException is thrown.
final RubyArray ary = (RubyArray) rubyObject;Maybe a ConcreteJavaProxy mimics a RubyArray?
The error does affect our production environment. Any help is greatly appreciated.