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

Deserialization/Instantiation failures at rest endpoint with multi-level generics #18621

Closed
ChrisSchoe opened this issue Jul 12, 2021 · 2 comments
Labels
kind/bug Something isn't working

Comments

@ChrisSchoe
Copy link

Describe the bug

Using Quarkus 2.0.1 with resteasy and jsonb fails in some cases when using classes for request bodies whose definition relies on multiple levels of generics. A minimal example can be found here.
When using Quarkus 1.13 everything works fine.

Expected behavior

Sending a POST request with the suitable json body to the hello endpoint should return status Code 200 and the text "Hello RestEasyNAME", where NAME is the name given in the json body, e.g.
curl -X 'POST' \ 'http://localhost:8080/hello' \ -H 'accept: text/plain' \ -H 'Content-Type: application/json' \ -d '{ "child": { "name": "string", "nickname": "Quarkus" } }'
should result in Hello RESTEasyQuarkus.

Actual behavior

We get a classloader error, as it is attempted to initialise the child field of the ConcreteContainer object by an object of type AbstractChild, which leads to the following error:

ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-0) HTTP Request to /hello failed, error id: 576852dd-c3db-4714-b956-7c776b83fe00-1: org.jboss.resteasy.spi.UnhandledException: 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 @3256951b) 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 @3256951b) at org.acme.getting.started.GreetingResource.hello(GreetingResource.java:18) at org.acme.getting.started.GreetingResource_Subclass.hello$$superforward1(GreetingResource_Subclass.zig:94) at org.acme.getting.started.GreetingResource_Subclass$$function$$2.apply(GreetingResource_Subclass$$function$$2.zig:33) 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.hello(GreetingResource_Subclass.zig:158) 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

How to Reproduce?

cf. GitHub repo.

The branch 'workaround' contains a minor change that at least provides working code. However, this should not be necessary.

Output of uname -a or ver

Darwin nbipmac000.local 20.5.0 Darwin Kernel Version 20.5.0:

Output of java -version

11.0.10

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.0.1

Build tool (ie. output of mvnw --version or gradlew --version)

apache-maven-3.8.1

Additional information

No response

@ChrisSchoe ChrisSchoe added the kind/bug Something isn't working label Jul 12, 2021
@stuartwdouglas
Copy link
Member

This is related to the upgrade from Yasson 1.0.8 to 1.0.9, if you force version 1.0.8 this works.

Can you report it at the Yasson project: https://github.com/eclipse-ee4j/yasson

@geoand
Copy link
Contributor

geoand commented Apr 11, 2023

Closing as we now seem to be including a Yasson version that fixes the issue

@geoand geoand closed this as completed Apr 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants