Skip to content

Java::JavaLang::ClassCastException: class org.jruby.java.proxies.ConcreteJavaProxy cannot be cast to class org.jruby.RubyArray #8178

@UweKubosch

Description

@UweKubosch

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions