Quarkus RestClient从MavenLocal引入时依赖注入失败问题
我有两个项目目录,一个存放API接口,另一个存放服务实现。想在BFF服务中使用RestClient,因此将包含用户API接口与RestClient的users-api项目发布至MavenLocal,随后在BFF服务中注入UserClient,但启动服务时抛出以下错误:
error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.client.UserClient and qualifiers [@RestClient] - java member: org.acme.resource.UserResource#userClient - declared on CLASS bean [types=[java.lang.Object, org.acme.resource.UserResource], qualifiers=[@Default, @Any], target=org.acme.resource.UserResource] at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1453) at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:311) at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:160) at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:472) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849) at io.quarkus.builder.BuildContext.run(BuildContext.java:256) at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538) at java.base/java.lang.Thread.run(Thread.java:1583) at org.jboss.threads.JBossThread.run(JBossThread.java:501) Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.client.UserClient and qualifiers [@RestClient] - java member: org.acme.resource.UserResource#userClient - declared on CLASS bean [types=[java.lang.Object, org.acme.resource.UserResource], qualifiers=[@Default, @Any], target=org.acme.resource.UserResource] at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:478) at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:624) at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:299) ... 11 more
我怀疑问题源于发布至MavenLocal的操作,application.yaml配置似乎未被加载,导致RestClient没有对应URL(已在build.gradle中添加implementation 'io.quarkus:quarkus-config-yaml')。若在BFF服务内重新创建UserClient则可正常运行。
相关配置如下:
UserClient 代码
@Path("/users") @RegisterRestClient(configKey = "users-api") public interface UserClient { @GET List<UserDto> list(); @GET @Path("/{id}") UserDto get(UUID id); @POST UserDto create(UserDto userDto); @PUT @Path("/{id}") UserDto update(UUID id, UserDto userDto); @DELETE @Path("/{id}") void delete(UUID id); }
UserResource 代码
@Path("/users") public class UserResource { @RestClient UserClient userClient; @Inject UserMapper userMapper; @GET public List<UserResponse> list() { List<UserDto> users = userClient.list(); return userMapper.toUserResponses(users); } }
application.yaml 配置
quarkus: rest-client: users-api: url: http://localhost:8082 #user service URL
(曾尝试添加scope: jakarta.inject.Singleton,但无效)
确保users-api项目的注解处理器生效:发布到MavenLocal前,需确认users-api项目的Quarkus注解处理器已生成必要的代理类和Bean元数据。检查Gradle配置:
- 正确应用
quarkus-gradle-plugin,确保编译阶段执行注解处理; - 项目依赖中包含
quarkus-rest-client,因为@RegisterRestClient需要该依赖生成代理。
- 正确应用
检查BFF服务的依赖完整性:在BFF的build.gradle中,除了
quarkus-config-yaml,必须添加quarkus-rest-client依赖,否则无法识别@RestClient注解并创建代理实例。验证MavenLocal中users-api包的内容:查看本地仓库里users-api的JAR包,确认包含
META-INF/jandex.idx、META-INF/quarkus-arc.properties等元数据文件。若缺失,需在users-api项目中执行./gradlew quarkusBuild命令重新构建,确保产物包含必要的Quarkus元数据。确认BFF配置的正确性:BFF的application.yaml需放在
src/main/resources目录下,确保构建时被打包进JAR;同时检查quarkus.rest-client.users-api.url配置是否正确。显式指定RestClient扫描包:若users-api的包不在BFF的默认扫描路径中,需在BFF的配置文件中添加扫描规则:
quarkus: rest-client: scan-packages: org.acme.client
内容的提问来源于stack exchange,提问作者FeckNeck

