All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kaizen4j.starter.resttemplate.RestTemplateAutoConfiguration Maven / Gradle / Ivy

package org.kaizen4j.starter.resttemplate;

import com.google.common.base.Preconditions;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

/**
 * Created by liuguowen on 2019/6/27.
 */
@Configuration
@EnableConfigurationProperties({RestTemplateProperties.class})
@ConditionalOnProperty(prefix = "ka4j.resttemplate", value = "enabled", havingValue = "true")
public class RestTemplateAutoConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(RestTemplateAutoConfiguration.class);

    private RestTemplateProperties restTemplateProperties;

    public RestTemplateAutoConfiguration(RestTemplateProperties restTemplateProperties) {
        this.restTemplateProperties = restTemplateProperties;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory,
                    HttpMessageConverter[] httpMessageConverters) {
        Preconditions.checkArgument(0 != httpMessageConverters.length, "HttpMessageConverter 数组不能为空");
        logger.info("Kaizen4j 自动配置 RestTemplate 使用 [{}]", clientHttpRequestFactory.getClass().getName());
        return new RestTemplateBuilder().requestFactory(() -> clientHttpRequestFactory)
                        .additionalMessageConverters(httpMessageConverters).build();
    }

    @Bean
    @ConditionalOnMissingBean
    public HttpMessageConverter[] httpMessageConverters() {
        return new HttpMessageConverter[] {new StringHttpMessageConverter(StandardCharsets.UTF_8),
                new MappingJackson2HttpMessageConverter(), new ByteArrayHttpMessageConverter()};
    }

    @Bean
    @ConditionalOnMissingBean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        OkHttpClient httpClient =
                        new OkHttpClient.Builder().connectTimeout(restTemplateProperties.getTimeout(), TimeUnit.SECONDS)
                                        .readTimeout(restTemplateProperties.getTimeout(), TimeUnit.SECONDS)
                                        .retryOnConnectionFailure(true)
                                        .writeTimeout(restTemplateProperties.getTimeout(), TimeUnit.SECONDS)
                                        .connectionPool(connectionPool()).build();

        return new OkHttp3ClientHttpRequestFactory(httpClient);
    }

    private ConnectionPool connectionPool() {
        return new ConnectionPool(restTemplateProperties.getMaxIdleConnections(),
                        restTemplateProperties.getKeepAliveDuration(), TimeUnit.SECONDS);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy