Describe the bug
use the following code (same as https://quarkus.io/guides/redis just with static public classes):
//usr/bin/env jbang "$0" "$@" ; exit $?
/**
* Run this with `jbang -Dquarkus.container-image.build=true build quarkus.java`
* and it builds a docker image.
*/
//DEPS io.quarkus:quarkus-redis-client:1.8.0.CR1
//DEPS io.quarkus:quarkus-resteasy-mutiny:1.8.0.CR1
//DEPS io.quarkus:quarkus-resteasy-jsonb:1.8.0.CR1
//DEPS org.testcontainers:testcontainers:1.14.3
//JAVA_OPTIONS -Djava.util.logging.manager=org.jboss.logmanager.LogManager
//Q:CONFIG quarkus.redis.hosts=localhost:6379
import io.quarkus.redis.client.RedisClient;
import io.quarkus.redis.client.reactive.ReactiveRedisClient;
import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.redis.client.Response;
import org.testcontainers.containers.GenericContainer;
import javax.ws.rs.Produces;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class quarkusclireddis {
static public class Increment {
public String key;
public int value;
public Increment(String key, int value) {
this.key = key;
this.value = value;
}
public Increment() {
}
}
@Singleton
static public class IncrementService {
@Inject
RedisClient redisClient;
@Inject
ReactiveRedisClient reactiveRedisClient;
public IncrementService() {
}
Uni<Void> del(String key) {
return reactiveRedisClient.del(Arrays.asList(key))
.map(response -> null);
}
String get(String key) {
return redisClient.get(key).toString();
}
void set(String key, Integer value) {
redisClient.set(Arrays.asList(key, value.toString()));
}
void increment(String key, Integer incrementBy) {
redisClient.incrby(key, incrementBy.toString());
}
Uni<List<String>> keys() {
return reactiveRedisClient
.keys("*")
.map(response -> {
List<String> result = new ArrayList<>();
for (Response r : response) {
result.add(r.toString());
}
return result;
});
}
}
@Path("/increments")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
static public class IncrementResource {
@Inject
IncrementService service;
@GET
public Uni<List<String>> keys() {
return service.keys();
}
@POST
public Increment create(Increment increment) {
service.set(increment.key, increment.value);
return increment;
}
@GET
@Path("/{key}")
public Increment get(@PathParam("key") String key) {
return new Increment(key, Integer.valueOf(service.get(key)));
}
@PUT
@Path("/{key}")
public void increment(@PathParam("key") String key, Integer value) {
service.increment(key, value);
}
@DELETE
@Path("/{key}")
public Uni<Void> delete(@PathParam("key") String key) {
return service.del(key);
}
}
public static void main(String... args) {
GenericContainer redis = null;
try {
redis = new GenericContainer("redis:3-alpine")
.withExposedPorts(6379);
redis.start();
io.quarkus.runtime.Quarkus.run(args);
} finally {
redis.stop();
}
}
}
then run with: jbang quarkusclireddis.java and you get:
2020-09-05 01:52:16,364 ERROR [org.jbo.res.res.i18n] (executor-thread-1) RESTEASY002020: Unhandled asynchronous exception, sending back 500: org.jboss.resteasy.spi.ApplicationException: java.lang.NoSuchMethodError: io.quarkus.redis.client.runtime.RedisAPIProducer: method 'void <init>()' not found
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:180)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:638)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:504)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:454)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:456)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:417)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:391)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:488)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:259)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:160)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:163)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:245)
at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:131)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:37)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:94)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: java.lang.NoSuchMethodError: io.quarkus.redis.client.runtime.RedisAPIProducer: method 'void <init>()' not found
at io.quarkus.redis.client.runtime.RedisAPIProducer_ClientProxy.<init>(RedisAPIProducer_ClientProxy.zig:24)
at io.quarkus.redis.client.runtime.RedisAPIProducer_Bean.proxy(RedisAPIProducer_Bean.zig:43)
at io.quarkus.redis.client.runtime.RedisAPIProducer_Bean.get(RedisAPIProducer_Bean.zig:315)
at io.quarkus.redis.client.runtime.RedisAPIProducer_Bean.get(RedisAPIProducer_Bean.zig:331)
at io.quarkus.redis.client.runtime.RedisAPIProducer_ProducerField_reactiveClient_Bean.create(RedisAPIProducer_ProducerField_reactiveClient_Bean.zig:162)
at io.quarkus.redis.client.runtime.RedisAPIProducer_ProducerField_reactiveClient_Bean.create(RedisAPIProducer_ProducerField_reactiveClient_Bean.zig:203)
at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
at io.quarkus.arc.impl.AbstractSharedContext.access$000(AbstractSharedContext.java:14)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
at io.quarkus.redis.client.runtime.RedisAPIProducer_ProducerField_reactiveClient_ClientProxy.arc$delegate(RedisAPIProducer_ProducerField_reactiveClient_ClientProxy.zig:93)
at io.quarkus.redis.client.runtime.RedisAPIProducer_ProducerField_reactiveClient_ClientProxy.keys(RedisAPIProducer_ProducerField_reactiveClient_ClientProxy.zig:6148)
at quarkusclireddis$IncrementService.keys(quarkusclireddis.java:76)
at quarkusclireddis$IncrementResource.keys(quarkusclireddis.java:97)
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:167)
... 27 more
looks like another class loading issue on first glance.
/cc @quarkusio/devtools
this one does NOT seem fixed. I'm updating the example to actually work with fixed redis port.
I saw https://github.com/quarkusio/quarkus/pull/11958 earlier today. It should have fixed this issue I suppose? @mkouba @stuartwdouglas
The actual issues is that transformation was not working in JBang, which I fixed in JBang. That PR would help it run with the latest release though. Either way it is no longer a problem.
I saw #11958 earlier today. It should have fixed this issue I suppose?
This PR should fix this particular issue but the main problem is that jbang probably does not see the transformed classes...
Most helpful comment
The actual issues is that transformation was not working in JBang, which I fixed in JBang. That PR would help it run with the latest release though. Either way it is no longer a problem.