我使用最新的 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 注释。
您可以禁用对生成的类的组件扫描。假设您的根包是“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 类。
我也面临着同样的问题。 项目中有多个restTemplate bean,并且由openapi-generator生成的ApiClient正在抱怨要自动装配哪个restTemplate。
对我有用的一个解决方案是提供自定义 ApiClient 胡子文件。 获取resttemplate库的ApiClient.mustache文件,并从注入restTemplate的构造函数中删除@Autowired注释。 这将阻止错误。
但是接下来您需要添加一个新的配置类,并通过显式设置所需的 RestTemplate 来提供 ApiClient bean。
openapi-generator author template -g java --library resttemplate
这将生成“out”目录,您将在 out ->libraries ->resttemplate ->ApiClient.mustache 下找到 ApiClient.mustache
{{#generateClientAsBean}}
@Autowired
{{/generateClientAsBean}}
public ApiClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
init();
}
<configuration>
<inputSpec>xyz.json</inputSpec>
<templateResourcePath>path_to_directory_where_templates_are_stored</templateResourcePath>
</configuration>
@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;
}
}