Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fromJson fails if multiple Levels of generics are involved #502

Closed
ChrisSchoe opened this issue Jul 13, 2021 · 1 comment · Fixed by #503
Closed

fromJson fails if multiple Levels of generics are involved #502

ChrisSchoe opened this issue Jul 13, 2021 · 1 comment · Fixed by #503
Assignees
Labels
bug Something isn't working right

Comments

@ChrisSchoe
Copy link

Describe the bug
I was directed here from reporting this as a Quarkus bug here.
Using classes implementing generics in a certain way can lead to fromJson not working properly and failing with the stacktrace posted below:

java.lang.ClassCastException: class model.AbstractChild cannot be cast to class model.ConcreteChild (model.AbstractChild and model.ConcreteChild are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @dddacdd) at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106) at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:372) at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519) at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261) at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161) at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364) at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247) at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73) at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:138) at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:93) at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:481) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2442) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1476) at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29) at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.ClassCastException: class model.AbstractChild cannot be cast to class model.ConcreteChild (model.AbstractChild and model.ConcreteChild are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @dddacdd) at org.acme.getting.started.GreetingResource.testYasson(GreetingResource.java:34) at org.acme.getting.started.GreetingResource_Subclass.testYasson$$superforward1(GreetingResource_Subclass.zig:132) at org.acme.getting.started.GreetingResource_Subclass$$function$$4.apply(GreetingResource_Subclass$$function$$4.zig:24) at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54) at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62) at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49) at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(InvocationInterceptor_Bean.zig:521) at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41) at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41) at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32) at org.acme.getting.started.GreetingResource_Subclass.testYasson(GreetingResource_Subclass.zig:280) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170) at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130) at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:660) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:524) at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:474) at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:476) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:434) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:408) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:69) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492) ... 15 more

To Reproduce
Using the model classes from the minimal example( https://github.com/ChrisSchoe/quarkus-resteasy-bug-minimal-example )
try to create an object of type ConcreteContainer from a Json-String (either given as a string or obtained via fromJson such as in the testYassonmethod here. The child-field of the resulting object is of type AbstractChild and the above error is thrown when trying to access the fields only contained in the subclass ConcreteChild.

Expected behavior
An object of type ConcreteContainer should be created and its field child should contain an object of type ConcreteChild whose fields are all accessible.

System information:

  • OS: MacOS BigSur
  • Java Version: 11.0.10
  • Yasson Version: 1.0.9
    Note: With Yasson 1.0.8 everything works fine
@ChrisSchoe ChrisSchoe added the bug Something isn't working right label Jul 13, 2021
@Verdent
Copy link
Member

Verdent commented Jul 19, 2021

Hi @ChrisSchoe ,
Thank you for reaching out. It really looks like a bug. I will make a fix for this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working right
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants