如何将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"),接下来只需:
- 在
application.properties中配置接口地址:
quarkus.rest-client.external-api.url=${EXTERNAL_API_URL:https://api.example.com}
- 创建请求头处理类(用于动态注入
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; } }
- 在生成的接口上添加
@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
相关产品推荐
相关产品推荐

