如何从OpenAPI生成的Java类获取请求方法与URL?
如何从OpenAPI Generator生成的Java API类中提取请求方法和URL用于DPoP凭证?
问题背景
我使用openapi-generator-maven-plugin生成Java API类,配合Nimbus处理认证逻辑。生成的类使用体验良好,但缺少提取端点请求方法(如GET/POST)和URL路径(如/v1/ping)的Getter方法——这些信息是生成DPoP凭证所需的htm和htu字段。
我期望能实现如下调用逻辑:
ApiClient apiClient = new ApiClient(); SomeApi api = new SomeApi(apiClient); prepareDpopProof(api.getMethodOfDoSomething(), apiClient.getBasePath() + api.getUrlOfDoSomething()); api.doSomething();
当前插件配置如下:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>7.8.0</version> <executions> <execution> <id>some_api</id> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${basedir}/src/main/resources/openapi/some_api.json</inputSpec> <output>${project.build.directory}/generated</output> <generatorName>java</generatorName> <apiPackage>some.api.api</apiPackage> <modelPackage>some.api.model</modelPackage> <invokerPackage>some.api.client</invokerPackage> <configOptions> <useJakartaEe>true</useJakartaEe> </configOptions> </configuration> </execution> </executions> </plugin>
我希望避免硬编码或手动实现这些方法,寻求优雅的解决方案。
解决方案
方案1:自定义模板自动生成Getter方法(推荐)
OpenAPI Generator支持通过自定义模板扩展生成逻辑,我们可以修改API类的模板,让生成器自动添加请求方法和路径的Getter:
- 从OpenAPI Generator的Java模板库中复制默认的
api.mustache模板文件,保存到项目的src/main/resources/openapi/templates目录下。 - 在模板中找到每个API方法的生成块,在方法末尾添加如下代码片段(替换模板中的变量占位符):
/** * Get the HTTP method for the {{operationId}} operation * @return HTTP method string (e.g. GET, POST) */ public String getMethodOf{{operationId}}() { return "{{httpMethod}}"; } /** * Get the URL path for the {{operationId}} operation * @return URL path string (e.g. /v1/ping) */ public String getUrlOf{{operationId}}() { return "{{path}}"; } - 在Maven插件配置中添加模板目录的引用:
<configuration> <!-- 原有配置 --> <templateDirectory>${basedir}/src/main/resources/openapi/templates</templateDirectory> </configuration>
重新执行生成命令后,所有API类都会自动包含getMethodOfXXX()和getUrlOfXXX()方法,完全符合你期望的调用方式。
方案2:反射提取RequestBuilder中的元数据(低侵入性)
如果不想修改模板,可以利用生成的API类中默认存在的XXXRequestBuilder()保护方法,通过反射提取请求方法和路径:
编写一个通用的元数据提取工具类:
import org.openapitools.client.request.RequestBuilder; import java.lang.reflect.Method; public class ApiMetadataExtractor { public static String getHttpMethod(Object apiInstance, String operationMethodName) throws Exception { // 调用生成的RequestBuilder方法 Method builderMethod = apiInstance.getClass().getDeclaredMethod(operationMethodName + "RequestBuilder"); builderMethod.setAccessible(true); RequestBuilder builder = (RequestBuilder) builderMethod.invoke(apiInstance); return builder.getHttpMethod().name(); } public static String getPath(Object apiInstance, String operationMethodName) throws Exception { Method builderMethod = apiInstance.getClass().getDeclaredMethod(operationMethodName + "RequestBuilder"); builderMethod.setAccessible(true); RequestBuilder builder = (RequestBuilder) builderMethod.invoke(apiInstance); return builder.getPath(); } }
调用示例:
ApiClient apiClient = new ApiClient(); SomeApi api = new SomeApi(apiClient); try { String method = ApiMetadataExtractor.getHttpMethod(api, "doSomething"); String path = ApiMetadataExtractor.getPath(api, "doSomething"); prepareDpopProof(method, apiClient.getBasePath() + path); api.doSomething(); } catch (Exception e) { // 处理反射调用异常 }
这个方案无需修改生成代码,仅依赖生成器默认生成的RequestBuilder方法,侵入性极低。
内容的提问来源于stack exchange,提问作者Halvor Holsten Strand
相关产品推荐
相关产品推荐

