Quarkus & Microprofile: Есть ли лучший способ использовать свойство из application.properties в @ClientHeaderParam? - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь создать простое приложение, которое вызывает API с quarkus-rest-client. Я должен ввести ключ API в качестве заголовка, который одинаков для всех ресурсов API. Поэтому я хотел бы поместить значение этого ключа API (которое зависит от среды dev/qa/prod) в файл application.properties, расположенный в src/main/resources.

Я пытался разными способами добиться этого:

  • Использовать непосредственно com.acme.Configuration.getKey в @ClientHeaderParam значение свойства
  • Создать класс StoresClientHeadersFactory, который реализует интерфейс ClientHeadersFactory для внедрения конфигурации

Наконец, я нашелописанный ниже способ заставить его работать.

Мой вопрос : есть ли лучший способ сделать это?

Вот мой код:

  • StoreService.java , который является моим клиентом для доступа к API
@Path("/stores")
@RegisterRestClient
@ClientHeaderParam(name = "ApiKey", value = "{com.acme.Configuration.getStoresApiKey}")
public interface StoresService {

    @GET
    @Produces("application/json")
    Stores getStores();

}
  • Configuration.java
@ApplicationScoped
public class Configuration {

    @ConfigProperty(name = "apiKey.stores")
    private String storesApiKey;

    public String getKey() {
        return storesApiKey;
    }

    public static String getStoresApiKey() {
        return CDI.current().select(Configuration.class).get().getKey();
    }

}
  • StoresController.java , который является контроллером REST
@Path("/stores")
public class StoresController {

    @Inject
    @RestClient
    StoresService storesService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Stores getStores() {
        return storesService.getStores();
    }

}

1 Ответ

0 голосов
/ 30 октября 2019

Я избавлюсь от класса Configuration и использую @HeaderParam, чтобы передать свойство конфигурации из конечной точки отдыха в клиент отдыха. Затем аннотация отправит это свойство в виде заголовка HTTP удаленной службе.

Что-то вроде этого должно работать:

@Path("/stores")
@RegisterRestClient
public interface StoresService {

    @GET
    @Produces("application/json")
    Stores getStores(@HeaderParam("ApiKey") storesApiKey);

}

@Path("/stores")
public class StoresController {
    @ConfigProperty(name = "apiKey.stores")
    private String storesApiKey;

    @Inject
    @RestClient
    StoresService storesService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Stores getStores() {
        return storesService.getStores(storesApiKey);
    }

}
...