在ClientHeadersFactory内部注入Bean不起作用

时间:2020-07-07 08:07:35

标签: quarkus microprofile quarkus-rest-client

我正在构建一个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的Javadoc中所提到的,我同时尝试了@ContextClientHeadersFactory。我还尝试使该类变为非抽象类,但它没有任何改变。

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),它将起作用。然后,我可以将地图分配给公共静态地图,然后可以使用Application.myPublicStaticMap从HeaderHandler访问该地图,但这很丑陋,所以我真的希望避免这种情况。

我已经在线搜索了,发现有几个人有相同的问题,但是根据blogpostthis one,它应该在Quarkus 1.3和MicroProfile 3.3(RestClient 1.4)上正常工作, m使用Quarkus 1.5.2。 即使第二个链接中的示例对我来说也不适用于注入UriInfo,因此问题并非出自我尝试注入的bean。

我已经为此苦苦挣扎了好几个星期,现在我真的想摆脱我的解决方法。 我可能只是想念一些东西,但这让我发疯。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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