I have created a custom endpoint in Keycloak by implementing the RealmResourceProviderFactory and RealmResourceProvider. Everything worked fine this way:
public class MyProviderFactory implements RealmResourceProviderFactory {
@Override
public RealmResourceProvider create(KeycloakSession keycloakSession) {
return new MyProvider(keycloakSession);
}
}
and
public class MyProvider implements RealmResourceProvider {
private CustomKafkaProducer<MyPayload> kafkaProducer;
public MyProvider(KeycloakSession keycloakSession) {
this.keycloakSession = keycloakSession;
kafkaProducer = new CustomKafkaProducer<>(new KafkaPropertyReader());
}
.......custom endpoint here....
}
But then I decided to move the creation of the kafkaProducer form the Provider to the ProviderFactory in order to make it easier to write tests. This is how the constructors look like after modification.
@Override
public RealmResourceProvider create(KeycloakSession keycloakSession) {
CustomKafkaProducer<MyPayload> kafkaProducer =
new CustomKafkaProducer<>(new KafkaPropertyReader());
return new MyProvider(keycloakSession, kafkaProducer);
}
and
public MyProvider(
KeycloakSession keycloakSession,
CustomKafkaProducer<MyPayload> kafkaProducer) {
this.keycloakSession = keycloakSession;
this.kafkaProducer = kafkaProducer;
}
After installing the SPI, Keycloak starts fine, but when I call my custom endpoint it throws this error:
ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-1) Uncaught server error: java.lang.NoSuchMethodError: 'void com.b.keycloak.provider.MyProvider.<init>(org.keycloak.models.KeycloakSession)'
2024-06-07T23:11:33.275095000Z at com.b.keycloak.factory.MyProviderFactory.create(MyProviderFactory.java:16)
2024-06-07T23:11:33.275146000Z at com.b.keycloak.factory.MyProviderFactory.create(MyProviderFactory.java:10)
2024-06-07T23:11:33.275180000Z at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:195)
2024-06-07T23:11:33.275211000Z at org.keycloak.models.KeycloakBeanProducer_ProducerMethod_getKeycloakSession_XoSEUTXOsE3bpqXlGMAykCiECUM_ClientProxy.getProvider(Unknown Source)
2024-06-07T23:11:33.275240000Z at org.keycloak.services.resources.RealmsResource.resolveRealmExtension(RealmsResource.java:264)
2024-06-07T23:11:33.275268000Z at org.keycloak.services.resources.RealmsResource$quarkusrestinvoker$resolveRealmExtension_c7e400748748bf35309bc60d82a4789f2a0e2d02.invoke(Unknown Source)
2024-06-07T23:11:33.275296000Z at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
2024-06-07T23:11:33.275324000Z at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
2024-06-07T23:11:33.275351000Z at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
2024-06-07T23:11:33.275378000Z at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582)
2024-06-07T23:11:33.275405000Z at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
2024-06-07T23:11:33.275474000Z at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
2024-06-07T23:11:33.275509000Z at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
2024-06-07T23:11:33.275535000Z at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
2024-06-07T23:11:33.275560000Z at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2024-06-07T23:11:33.275586000Z at java.base/java.lang.Thread.run(Thread.java:840)
What could be the problem?