You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将OpenAPI生成的API用作Quarkus Rest Client?

在Quarkus中复用OpenAPI生成的接口并结合RestClient依赖注入

下面提供三种可行方案,帮你摆脱手动创建实例的麻烦,同时复用OpenAPI生成的ExternalAPI类:

方案一:修改OpenAPI Generator插件配置,自动生成带Quarkus注解的接口

直接在Maven插件中配置,让生成的ExternalAPI接口自动带上Quarkus RestClient所需注解,后续更新OpenAPI YAML重新生成时也能保留配置:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>6.6.0</version> <!-- 使用最新稳定版本 -->
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/resources/your-api.yaml</inputSpec>
                <generatorName>java</generatorName>
                <library>quarkus</library> <!-- 选择Quarkus适配库 -->
                <configOptions>
                    <interfaceOnly>true</interfaceOnly> <!-- 只生成接口,不生成实现类 -->
                    <registerRestClient>true</registerRestClient> <!-- 自动添加@RegisterRestClient注解 -->
                    <configKey>external-api</configKey> <!-- 指定配置键,对应application.properties -->
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

生成后的ExternalAPI会自动带有@RegisterRestClient(configKey="external-api"),接下来只需:

  1. 在application.properties中配置接口地址:
quarkus.rest-client.external-api.url=${EXTERNAL_API_URL:https://api.example.com}
  1. 创建请求头处理类(用于动态注入MyToken):
public class ExternalApiHeaderFactory implements ClientHeadersFactory {

    @Inject
    TokenProvider tokenProvider; // 自定义的Token获取服务

    @Override
    public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incoming, MultivaluedMap<String, String> outgoing) {
        MultivaluedMap<String, String> headers = new MultivaluedHashMap<>(outgoing);
        headers.add("MyToken", tokenProvider.getValidToken());
        return headers;
    }
}
  1. 在生成的接口上添加@RegisterClientHeaders(也可通过插件的<additionalInterfaceAnnotations>配置自动添加),之后直接注入使用:
@Inject
@RestClient
ExternalAPI externalAPI;

方案二:通过接口继承扩展生成类,添加Quarkus注解

如果无法修改OpenAPI插件配置,可创建一个继承自生成的ExternalAPI的新接口,在新接口上添加Quarkus的RestClient注解:

@RegisterRestClient(configKey = "external-api")
@RegisterClientHeaders(ExternalApiHeaderFactory.class)
public interface ExternalApiClient extends ExternalAPI {
}

然后配置application.properties:

quarkus.rest-client.external-api.url=${EXTERNAL_API_URL}

之后直接注入扩展后的接口即可:

@Inject
@RestClient
ExternalApiClient externalApiClient;

这种方式不会修改自动生成的ExternalAPI类,避免重新生成时丢失自定义配置,同时保留了Quarkus RestClient的所有特性。

方案三:用CDI Producer管理生成接口的实例

如果必须直接使用生成的ExternalAPI接口,可通过CDI Producer将手动创建的实例交给容器管理,实现依赖注入:

@ApplicationScoped
public class ExternalApiProducer {

    @ConfigProperty(name = "external.api.url")
    String apiBaseUrl;

    @Inject
    TokenProvider tokenProvider;

    @Produces
    @RestClient
    public ExternalAPI createExternalAPI() {
        return RestClientBuilder.newBuilder()
                .baseUri(URI.create(apiBaseUrl))
                .register((ClientRequestFilter) context -> 
                    context.getHeaders().add("MyToken", tokenProvider.getValidToken()))
                .build(ExternalAPI.class);
    }
}

之后就可以直接注入ExternalAPI:

@Inject
@RestClient
ExternalAPI externalAPI;

这种方式保留了你原本的RestClientBuilder配置逻辑,同时让实例由Quarkus容器管理,避免手动创建的冗余。


内容的提问来源于stack exchange,提问作者WesternGun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:15:12