Reputation: 1
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
Reputation: 1
Simply changed the order of annotation on requestFilter class and it worked.
@ApplicationScoped
@Provider
@RegisterRestClient
@RegisterClientHeaders
public class RequestFilters {
..
..
}
Upvotes: 0