Quarkus & Microprofile:有没有更好的方法将 application.properties 中的属性用于@ClientHeaderParam?

Posted

技术标签:

【中文标题】Quarkus & Microprofile:有没有更好的方法将 application.properties 中的属性用于@ClientHeaderParam?【英文标题】:Quarkus & Microprofile : Is there a better way to use a property from application.properties into @ClientHeaderParam? 【发布时间】:2020-02-21 19:30:46 【问题描述】:

我正在尝试构建一个简单的应用程序,该应用程序使用quarkus-rest-client 调用 API。 我必须注入一个 API 密钥作为标头,该标头对于 API 的所有资源都是相同的。 所以我想把这个 API Key 的值(取决于环境dev/qa/prod)放在位于src/main/resourcesapplication.properties 文件中。

我尝试了不同的方法来实现这一点:

直接使用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();
    


【问题讨论】:

您能否提供更多关于为什么使用StoresClientHeadersFactory 不起作用的详细信息?同意它不漂亮,但至少它有效。如果有帮助,我们可以修改规范以支持注释中的字符串值、配置值或方法? 我同意它有效!我问是否有我没有找到的更好的解决方案。感谢您对StoresClientHeadersFactory 的回复:@Inject Configuration applicationConfigurationdoesn't work。当我将它用于StoresClientHeadersFactory.update(inboundHeaders, outboudHeaders) 方法时,该对象为空 好吧,我怀疑这是因为该类不是 CDI bean,所以注入不起作用。你能提出一个问题吗:github.com/quarkusio/quarkus/issues github.com/quarkusio/quarkus/issues/5030 【参考方案1】:

聚会迟到了,但把它放在这里供我自己参考。使用@ClientHeaderParam 和@HeaderParam 似乎有区别,所以我进一步调查了一下: 根据Microprofile docs,您可以为花括号中的值放置一个计算方法。该方法可以提取属性值。

更多示例请参见链接。

编辑:我想出的与原来的相似,但在接口上使用了默认方法,因此您至少可以丢弃 Configuration 类。另外,使用 org.eclipse.microprofile.config.Config 和 ConfigProvider 类来获取配置值:

@RegisterRestClient
@ClientHeaderParam(name = "Authorization", value = "getAuthorizationHeader")
public interface StoresService 

    default String getAuthorizationHeader()
        final Config config = ConfigProvider.getConfig();
        return config.getValue("apiKey.stores", String.class);
    

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

【讨论】:

【参考方案2】:

我将摆脱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);
    


【讨论】:

以上是关于Quarkus & Microprofile:有没有更好的方法将 application.properties 中的属性用于@ClientHeaderParam?的主要内容,如果未能解决你的问题,请参考以下文章

云原生时代高性能Java框架—Quarkus

云原生时代高性能Java框架—Quarkus

如何更新使用的quarkus版本

Quarkus 系统日志消息格式

如何增加 Quarkus 中的事务超时?

Quarkus+Apache Camel+Swagger ui