Внедрение зависимостей не работает в RestClientBuilderListener - PullRequest
0 голосов
/ 11 апреля 2020

Я следовал инструкции по работе с остальными клиентами на веб-сайте Quarkus. Работает нормально. Но при регистрации глобального поставщика с использованием шаблона ServiceLoader, как описано в спецификации, внедрение компонентов CDI не сработало, все они равны нулю. Я скачал пример и просто добавил следующие классы:

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);
    }
}

Я также добавил файл META-INF / services / org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener с содержимым org.acme.rest.client.MyListener. Метод MyListener onNewBuilder вызывается, но внедренный поставщик MyExceptionMapper имеет значение null. Как зарегистрировать глобального провайдера в клиенте Quarkus?

1 Ответ

0 голосов
/ 11 апреля 2020

Реализация RestClientBuilderListener не является компонентами CDI - это просто объекты, которые создаются с помощью обычного механизма Java ServiceLoader при использовании RestClientBuilder.

Так что если вы хотите получить компоненты CDI когда вызывается onNewBuilder, вы можете сделать что-то вроде:

CDI.current().select(MyExceptionMapper.class).get()

Кроме того, вам нужно аннотировать MyExceptionMapper с помощью @Provider, а не @ApplicationScoped.

...