在 ClientHeadersFactory 中注入 bean 不起作用

Injection of bean inside ClientHeadersFactory doesn't work

我正在构建一个 Quarkus 应用程序,它使用 resteasy 处理 http 请求并使用 restclient 调用另一个 api,我需要传播一个 header 并动态添加另一个,所以我添加了一个class 实现了 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();

我的问题是配置注入不起作用。正如 ClientHeadersFactory 的 javadoc 中所述,我尝试使用 @Inject@Context。我还尝试使 class 成为非抽象的,但它并没有改变任何东西。

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 注入到我的主 class (@QuarkusMain) 中,它就可以工作。然后我可以将地图分配给一个 public 静态地图,然后我可以使用 Application.myPublicStaticMap 从我的 HeaderHandler 访问它,但这很丑陋,所以我真的希望避免这种情况。

我在网上搜索过,看到有几个人遇到了同样的问题,但根据这个 blogpost, or this one,它应该从 Quarkus 1.3 和 MicroProfile 3.3 (RestClient 1.4) 开始工作,而我使用的是 Quarkus 1.5。 2. 即使是第二个 link 中的示例也无法通过注入 UriInfo 对我起作用,因此问题并非来自我尝试注入的 bean。

几周来我一直在为此苦苦挣扎,现在我真的很想摆脱我的解决方法。 我可能只是错过了一些东西,但这让我发疯了。

在此先感谢您的帮助。

这个问题终于在 Quarkus 1.8 中得到解决。