为生成的 api rest 客户端配置连接和读取超时

Configuring connection and read timeouts for a generated api rest client

我正在使用 swagger-codegen-maven-plugin 生成一个 api 休息客户端。我正在使用 resttemplate 库,我的 pom.xml 配置如下所示。

   <build>
        <plugins>
            <plugin>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-codegen-maven-plugin</artifactId>
                <version>2.3.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/../swagger.yml</inputSpec>
                            <language>java</language>
                            <generateApis>true</generateApis>
                            <generateApiTests>false</generateApiTests>
                            <generateSupportingFiles>true</generateSupportingFiles>
                            <generateModelDocumentation>false</generateModelDocumentation>
                            <modelPackage>my.base.package.here</modelPackage>
                            <apiPackage>my.base.api.package.here</apiPackage>
                            <modelNamePrefix>MyApiPrefix</modelNamePrefix>
                            <configOptions>
                                <library>resttemplate</library>
                                <sourceFolder>src/gen/java</sourceFolder>
                                <java8>true</java8>
                                <dateLibrary>java8</dateLibrary>
                                <hideGenerationTimestamp>true</hideGenerationTimestamp>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

客户端生成成功。现在我在 spring 启动应用程序中使用此客户端,我需要配置连接超时和读取超时值。

我很惊讶地发现生成的 ApiClient 上没有这两个属性的 setter。所以我不得不想出一个解决方法,使用 RestTemplateBuilder 来做到这一点。它看起来像这样:

@Configuration
public class MyApiClientConfiguration {

    @Autowired
    public MyApiClientConfiguration(
            final RestTemplate restTemplate,
            final RestTemplateBuilder restTemplateBuilder
    ) {
        restTemplateBuilder
                .setConnectTimeout(connectTimeoutValue)
                .setReadTimeout(readTimeoutValue)
                .configure(restTemplate);

        ApiClient apiClient = new ApiClient(restTemplate);

        MyApiPrefixApi.setApiClient(apiClient);
    }
}

configure 方法的文档没有说太多:

配置

public T 配置(T restTemplate)

Configure the provided RestTemplate instance using this builder.

这是使用 resttemplate 库时配置超时的标准方法吗? 更新: 我的实际实现不起作用(似乎 ResttemplateBuilder 自己的配置以错误的方式干扰了自动装配的 RestTemplate(我试图通过构建器进一步配置))配置。其他库(例如jersey)生成的api客户端提供了一个setter直接配置超时使用:

apiClient.setConnectTimeout(timeoutValue);

虽然使用 configure 方法不起作用,但可以通过使用 RestTemplateBuilder 的 build[= 创建 RestTemplate bean 来配置超时值18=]方法。

@Bean
public RestTemplate restTemplate(
       RestTemplateBuilder restTemplateBuilder,
       final int serviceConnectionTimeout,
       final int serviceReadTimeout
        ) {
        return restTemplateBuilder
            .setConnectTimeout(serviceConnectionTimeout)
            .setReadTimeout(serviceReadTimeout)
            .build();
}

参考:Spring RestTemplate timeout