Neha Rane
Neha Rane

Reputation: 1

Quarkus Reactive WebClient Gives Unsatisfied dependency

I am trying to boot up a simple quarkus app where I can filter the incoming request and check the token in the header. But getting unsatisfied dependency. So any request comes to resource should first get through the requestFilter.java

I want application to build successfully. Quarkus version 2.16.1.Final, Java 17 and gradle 7.5.1

build.gradle

plugins {
    id 'java'
    id 'io.quarkus'
}
repositories {
    mavenCentral()
    mavenLocal()
}
dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
    implementation('io.quarkus:quarkus-arc')
    testImplementation('io.quarkus:quarkus-junit5')
    testImplementation('io.rest-assured:rest-assured')
    implementation('io.quarkus:quarkus-resteasy-reactive')
    implementation("io.quarkus:quarkus-rest-client-reactive-jackson")
    implementation("io.quarkus:quarkus-kubernetes")
    implementation("io.quarkus:quarkus-vertx")
    implementation("io.smallrye.reactive:smallrye-mutiny-vertx-web-client")
}
version '1.0-SNAPSHOT'
java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}
test {
    systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager"
}
compileJava {
    options.encoding = 'UTF-8'
    options.compilerArgs << '-parameters'
}
compileTestJava {
    options.encoding = 'UTF-8'
}

RequestFilter.java

import io.quarkus.runtime.util.StringUtil;
import io.vertx.mutiny.core.Vertx;
import io.vertx.mutiny.ext.web.client.WebClient;
import org.jboss.logging.Logger;
import org.jboss.resteasy.reactive.server.ServerRequestFilter;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;

@Provider
@ApplicationScoped
public class RequestFilters {

    @Inject
    UriInfo uriInfo;
    @Inject
    Logger logger; 
    
    private final Vertx vertx;
    private final WebClient client;
    @Inject
    public RequestFilters(Vertx vertx, WebClient client) {
        this.vertx = vertx;
        this.client = WebClient.create(vertx);
    }

    private static final String USER_TOKEN_JWT = "usertoken";
    
    @ServerRequestFilter
    public void requestFilter(ContainerRequestContext requestContext) throws Exception {
        
        if (StringUtil.isNullOrEmpty(requestContext.getHeaders().getFirst(USER_TOKEN_JWT))) {
            logger.error("User token is missing.");
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }

        var requestUri = uriInfo.getRequestUri().getPath();

        client.getAbs(requestUri)
                //.host("")
                //.port(8080)
                .send();
    }
}

Exception

java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
    [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type io.vertx.mutiny.ext.web.client.WebClient and qualifiers [@Default]
    - java member: *.*.*.gateway.RequestFilters():client
    - declared on CLASS bean [types=[*.*.*.gateway.RequestFilters, java.lang.Object], qualifiers=[@Default, @Any], target=*.*.*.gateway.RequestFilters]
    at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1223)

Upvotes: 0

Views: 616

Answers (1)

Neha Rane
Neha Rane

Reputation: 1

Simply changed the order of annotation on requestFilter class and it worked.

@ApplicationScoped
@Provider
@RegisterRestClient
@RegisterClientHeaders
public class RequestFilters {
..
..
}

Upvotes: 0

Related Questions