OpenAPI 生成器向 ApiClient 构造函数添加/生成注释

问题描述 投票:0回答:2

我使用最新的 OpenAPI 生成器 6.2.1 (https://github.com/OpenAPITools/openapi-generator) 来生成带有 Resttemplate 库的 ApiClient,效果非常好。

在我的应用程序中,我现在有两个不同的 RestTemplate bean。所以 Spring 不知道在 ApiClient 构造函数中使用哪一个。

com.xyz.ApiClient 中构造函数的参数 0 需要单个 bean,但找到了 2 个

还有解决问题的提示:

考虑将其中一个bean标记为@Primary,更新消费者以接受多个bean,或使用@Qualifier来标识应该使用的bean

我不想用@Primary标记其中一个bean,因为它不是想要使用的主要bean。

我想将 @Qualifier 添加到生成的 ApiClient 构造函数中,如下所示:

    @Autowired
    public ApiClient(@Qualifier("myClientProperties") RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
        init();
    }

如何将 @Qualifier 注解添加到生成的构造函数中?

我阅读了大量 openapi 生成器文档,但没有发现任何有用的内容。有一个解决方案,为模型添加注释(OpenApi配置的configOptions中的additionalModelTypeAnnotations)。

我希望为 ApiClient 构造函数生成 @Qualifier 注释。

spring annotations openapi resttemplate openapi-generator
2个回答
1
投票

您可以禁用对生成的类的组件扫描。假设您的根包是“my.root.package”,并且您将类生成为“my.root.package. generated”,请使用以下内容注释您的 App / Config 类:

@ComponentScan(basePackages = "my.root.package",
           excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX,
                                                  pattern = "my.root.package.generated.*"))

然后,您可以根据您的其余模板创建自己的(合格的)ApiClient:

@Bean("rest-template-1")
public RestTemplate restTemplate1() {
    return new RestTemplate();
}

@Bean("rest-template-2")
public RestTemplate restTemplate2() {
    return new RestTemplate();
}

@Bean("api-client-1")
public ApiClient apiClient1(@Qualifier("rest-template-1") RestTemplate restTemplate) {
    return new ApiClient(restTemplate);
}

@Bean("api-client-2")
public ApiClient apiClient2(@Qualifier("rest-template-2") RestTemplate restTemplate) {
    return new ApiClient(restTemplate);
}

使用这些不同的合格 ApiClient,您可以根据需要初始化 API 类。


0
投票

我也面临着同样的问题。 项目中有多个restTemplate bean,并且由openapi-generator生成的ApiClient正在抱怨要自动装配哪个restTemplate。

对我有用的一个解决方案是提供自定义 ApiClient 胡子文件。 获取resttemplate库的ApiClient.mustache文件,并从注入restTemplate的构造函数中删除@Autowired注释。 这将阻止错误。

但是接下来您需要添加一个新的配置类,并通过显式设置所需的 RestTemplate 来提供 ApiClient bean。

  1. 使用命令获取 ApiClient.mustache:
   openapi-generator author template -g java --library resttemplate

这将生成“out”目录,您将在 out ->libraries ->resttemplate ->ApiClient.mustache 下找到 ApiClient.mustache

  1. 编辑 ApiClient.mustache 并删除 @Autowired 注释以及构造函数中的generateClientAsBean 检查(前 3 行)
{{#generateClientAsBean}}
@Autowired
{{/generateClientAsBean}}
public ApiClient(RestTemplate restTemplate) {
    this.restTemplate = restTemplate;
    init();
}
  1. 配置 openapi-generator 插件以使用自定义模板。假设您正在使用 Maven:
<configuration>
<inputSpec>xyz.json</inputSpec>
<templateResourcePath>path_to_directory_where_templates_are_stored</templateResourcePath>
</configuration>
  1. 为 ApiClient bean 添加一个配置类并将其设为主要:
@Configuration
public class xyzApiClientRestTemplateConfiguration {

 @Bean("myCustomerRestTemplate")
 public RestTemplate getCustomRestTemplate() {
   <your custom logic goes here>
 }

 @Bean("xyzApiClient")
 @Primary
 public ApiClient getCustomApiClient() {
 
   ApiClient apiClient = new ApiClient(getCustomRestTemplate())
   .
   .
   return client;

 }

}
© www.soinside.com 2019 - 2024. All rights reserved.