Инъекция bean-компонента внутри ClientHeadersFactory не работает

Я создаю приложение Quarkus, которое обрабатывает HTTP-запросы с рестайлингом и вызывает другой api с помощью restclient, и мне нужно распространить заголовок и добавить еще один на лету, поэтому я добавил класс, реализующий 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, как указано в javadoc 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-компонента, который я пытаюсь ввести.

Я боролся с этим в течение нескольких недель, и я действительно хотел бы избавиться от моего обходного пути сейчас. Я, наверное, что-то упускаю, но это сводит меня с ума.

Заранее спасибо за помощь.

0 ответов

Эта проблема была наконец решена в Quarkus 1.8.

Другие вопросы по тегам