quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.74k stars 2.67k forks source link

Getting noSuchMethodException on native build resteasy reactive server using reactive client #21133

Closed manofthepeace closed 2 years ago

manofthepeace commented 2 years ago

Describe the bug

Hi,

I am new to quarkus, I have a pretty good java/spring background. I just started a Quarkus project and I have a really simple error. I am pretty sure the issue is me being novice but I cannot figure it out.

Generated a project using quarkus 2.4.0 final, using the following extensions;

quarkus-resteasy-reactive quarkus-rest-client-reactive-jackson quarkus-smallrye-health quarkus-quartz

When I use quartz scheduler, to go to my "rest-client" everything works fine (I log the response). Same thing using quarkus:dev. Basically I changed the GreetingResource to the following;

@Path("/test")
public class HttpController {

    @RestClient
    StreamService streamService;

    @GET
    @Path("/hello")
    @Produces(MediaType.APPLICATION_JSON)
    public Uni<Stream> testCall() {
        return streamService.getStreams();
    }
}

StreamService being just a stub which returns a json object that I receive as a pojo Stream object with Jackson

When I do a curl to /test/hello I do see my json come back properly with running with quarkus:dev

When I do the same curl on the natively compiled application with graalVm 21.3.0 I get ERROR [org.jbo.res.rea.com.cor.AbstractResteasyReactiveContext] (vert.x-eventloop-thread-0) Request failed: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.company.HttpController.testCall()

Expected behavior

method in HttpController should be found when testing native image, and response should be returned (as does the jar does)

Actual behavior

getting NoSuchMethodException instead of getting a response back

How to Reproduce?

https://github.com/manofthepeace/quarkus-reproducer-21133

Steps to reproduce; 1- mvn quarkus:dev on the stub and exception project 2- send curl to /hello (get back json) 3- mvn clean package -Pnative on exception project 4- run the native app 5- send curl to /hello (get RuntimeException)

Output of uname -a or ver

Darwin MBP 20.6.0 Darwin Kernel Version 20.6.0: Mon Aug 30 06:12:21 PDT 2021; root:xnu-7195.141.6~3/RELEASE_X86_64 x86_64

Output of java -version

openjdk version "11.0.13" 2021-10-19 OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8) OpenJDK 64-Bit Server VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode)

GraalVM version (if different from Java)

21.3.0

Quarkus version or git rev

2.4.0.FInal

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

Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)

Additional information

No response

quarkus-bot[bot] commented 2 years ago

/cc @FroMage, @geoand, @stuartwdouglas

stuartwdouglas commented 2 years ago

A reproducer would be really helpful here.

DmitryErmolchik commented 2 years ago

@manofthepeace I faced absolutely the same problem. My solution is to add annotation @RegisterForReflection to the class. But I'm baffled why NativeImageTest didn't catch this problem.

manofthepeace commented 2 years ago

I did solve the problem by trying few different thing. I have added a reproducer here in case (follow readme if used); https://github.com/manofthepeace/quarkus-reproducer-21133

So what fixed it for me was not @RegisterForReflection oddly enough the jackson class, works without it, natively. Was working fine when triggered via quartz scheduler.

What made it work is changing the pom dependency from quarkus-resteasy-reactive to quarkus-resteasy-reactive-jackson. It kind of make sense in a way, since I am returning and object to be serialized, but I find it really odd that it works fine when running the jar, but throws a NoSuchMethodException while running the native app. Like how come the jar is able to serialize the object without the -jackson dependency is not clear to me.

geoand commented 2 years ago

As Stuart said, attaching a small project that exhibits this behavior would be a tremendous help for us

manofthepeace commented 2 years ago

@geoand I have linked a github repo for a reproducer in the last comment. I have now edited the first post to reflect it. https://github.com/manofthepeace/quarkus-reproducer-21133 Please advise if you need anything else.

geoand commented 2 years ago

If you use quarkus-resteasy-reactive-jackson (which should be used when serialization / deserialization is needed for the server part), the problem goes away.

manofthepeace commented 2 years ago

@geoand thanks for the reply and your time. That is indeed my finding/reproducer. I find it still odd, that the jar version works without it, but the native one throws a NoMethodException. But if that's normal behaviour, so be it!. Thanks again.

geoand commented 2 years ago

It's expected if you don't use the "blessed" dependencies.

elrob commented 2 years ago

I hit the same issue. Same solution. quarkus-resteasy-reactive works fine in JVM mode but native mode required switching to quarkus-resteasy-reactive-jackson

DmitryErmolchik commented 2 years ago

@elrob Hi, You need to use the right combination of Quarkus modules: `

io.quarkus quarkus-resteasy-reactive-jackson
<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-rest-client-reactive-jackson</artifactId>
</dependency>

`