我正在构建一个 Quarkus 应用程序,它使用 resteasy 处理 http 请求并使用 restclient 调用另一个 api,我需要传播一个标头并动态添加另一个,所以我添加了一个实现 ClientHeadersFactory 的类。
这是代码:
@ApplicationScoped
public abstract class MicroServicesHeaderHandler implements ClientHeadersFactory {
@Inject
MicroServicesConfig config;
@Override
public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders,
MultivaluedMap<String, String> clientOutgoingHeaders) {
// Will be merged with outgoing headers
return new MultivaluedHashMap<>() {{
put("Authorization", Collections.singletonList("Bearer " + config.getServices().get(getServiceName()).getAccessToken()));
put("passport", Collections.singletonList(incomingHeaders.getFirst("passport")));
}};
}
protected abstract String getServiceName();
我的问题是配置的注入不起作用。我尝试了@Inject
和@Context
,如ClientHeadersFactory
. 我也试图使类非抽象,但它没有改变任何东西。
MicroServicesConfig 是一个@Startup
bean,因为它需要在Quarkus.run()
调用之前进行初始化,否则热重载不再起作用,因为它需要处理请求。这是代码仅供参考:
@Getter
@Startup
@ApplicationScoped
public final class MicroServicesConfig {
private final Map<String, MicroService> services;
MicroServicesConfig(AKV akv, ABS abs) {
// some code to retrieve an encrypted file from a secure storage, decrypt it and initialize the map out of it
}
这似乎是一个问题,ClientHeadersFactory
因为如果我在我的主类()中注入我的 bean @QuarkusMain
,它就可以工作。然后我可以将地图分配给一个公共静态地图,然后我可以从我的 HeaderHandler 访问它,Application.myPublicStaticMap
但这很难看,所以我真的更愿意避免这种情况。
我在网上搜索过,发现有几个人有同样的问题,但根据这篇博文或这篇博文,它应该从Quarkus 1.3 和 MicroProfile 3.3 (RestClient 1.4) 开始工作,我正在使用 Quarkus 1.5.2。即使是第二个链接中的示例也不适用于注入 UriInfo ,因此问题不是来自我尝试注入的 bean。
我已经为此苦苦挣扎了好几个星期,现在我真的很想摆脱我的解决方法。我可能只是错过了一些东西,但这让我发疯。
在此先感谢您的帮助。