quarkus - 依赖注入在 RestClientBuilderListener 中不起作用
问题描述
我遵循了 Quarkus 网站上的其余客户端指南。它工作正常。但是,当使用 ServiceLoader 模式注册全局提供程序时,如规范中所述,CDI bean 注入不起作用,它们都是空的。我下载了示例并简单地添加了以下类:
package org.acme.rest.client;
import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.core.Response;
@ApplicationScoped
public class MyExceptionMapper implements ResponseExceptionMapper<Exception> {
@Override
public Exception toThrowable (Response response) {
return new Exception();
}
}
package org.acme.rest.client;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class MyListener implements RestClientBuilderListener {
@Inject MyExceptionMapper myExceptionMapper;
@Override
public void onNewBuilder (RestClientBuilder builder) {
builder.register(myExceptionMapper);
}
}
我还添加了内容为 org.acme.rest.client.MyListener 的文件 META-INF/services/org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener。调用了 MyListener onNewBuilder 方法,但注入的提供程序 MyExceptionMapper 为 null。如何在 Quarkus 客户端注册全球提供商?
解决方案
实现RestClientBuilderListener
不是 CDI bean - 它们只是在使用时通过普通 Java ServiceLoader 机制创建的对象RestClientBuilder
。
因此,如果您想在onNewBuilder
调用时获取 CDI bean,您可以执行以下操作:
CDI.current().select(MyExceptionMapper.class).get()
此外,您需要MyExceptionMapper
使用 @Provider 进行注释,而不是@ApplicationScoped
.
推荐阅读
- python - 如何在 python 中将 csv 中的两列组合为我的 ggplot 的 x 轴?
- java - MD5 - 未定义字符串类型的方法
- json - 以编程方式用数据填充 Firestore 文档
- mysql - 需要为现有项目动态更改时区
- angular - input[ngbdatepicker] 指令的用例
- java - 为什么我的控制台输入没有终止。如果我删除代码 countSwaps(a,size) 则控制台输入终止,否则不会
- java - C#接口协方差,指定参数类型
- python - findall 语句中的 " 问题
- c# - 有没有办法使用不存在的成员变量从字典中选择一个元素?
- openedge - SQL Explorer 中 -char 参数的用途是什么?