
com.tosan.client.http.starter.configuration.AbstractFeignConfiguration Maven / Gradle / Ivy
package com.tosan.client.http.starter.configuration;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.tosan.client.http.core.Constants;
import com.tosan.client.http.core.HttpClientProperties;
import com.tosan.client.http.core.factory.ConfigurableApacheHttpClientFactory;
import com.tosan.client.http.starter.impl.feign.CustomErrorDecoder;
import com.tosan.client.http.starter.impl.feign.CustomErrorDecoderConfig;
import com.tosan.client.http.starter.impl.feign.exception.FeignConfigurationException;
import com.tosan.client.http.starter.impl.feign.logger.HttpFeignClientLogger;
import com.tosan.tools.mask.starter.config.SecureParameter;
import com.tosan.tools.mask.starter.config.SecureParametersConfig;
import com.tosan.tools.mask.starter.replace.JacksonReplaceHelper;
import com.tosan.tools.mask.starter.replace.JsonReplaceHelperDecider;
import com.tosan.tools.mask.starter.replace.RegexReplaceHelper;
import feign.*;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import feign.hc5.ApacheHttp5Client;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.core5.http.ContentType;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.AnnotatedParameterProcessor;
import org.springframework.cloud.openfeign.FeignFormatterRegistrar;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.core.convert.ConversionService;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.tosan.tools.mask.starter.configuration.MaskBeanConfiguration.SECURED_PARAMETERS;
/**
* @author Ali Alimohammadi
* @since 7/19/2022
*/
public abstract class AbstractFeignConfiguration {
protected ObjectFactory messageConverters;
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
return objectMapper;
}
public JsonReplaceHelperDecider replaceHelperDecider(JacksonReplaceHelper jacksonReplaceHelper,
RegexReplaceHelper regexReplaceHelper,
SecureParametersConfig secureParametersConfig) {
return new JsonReplaceHelperDecider(jacksonReplaceHelper, regexReplaceHelper, secureParametersConfig);
}
public SecureParametersConfig secureParametersConfig() {
HashSet securedParameters = new HashSet<>(SECURED_PARAMETERS);
securedParameters.add(Constants.AUTHORIZATION_SECURE_PARAM);
securedParameters.add(Constants.PROXY_AUTHORIZATION_SECURE_PARAM);
return new SecureParametersConfig(securedParameters);
}
public Logger httpFeignClientLogger(JsonReplaceHelperDecider replaceHelperDecider, String serverName) {
return new HttpFeignClientLogger(serverName, replaceHelperDecider);
}
public ConfigurableApacheHttpClientFactory apacheHttpClientFactory(HttpClientBuilder builder,
PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder,
HttpClientProperties customServerClientConfig) {
return new ConfigurableApacheHttpClientFactory(builder, connectionManagerBuilder, customServerClientConfig);
}
public ClientHttpRequestFactory clientHttpRequestFactory(ConfigurableApacheHttpClientFactory apacheHttpClientFactory) {
return new HttpComponentsClientHttpRequestFactory(apacheHttpClientFactory.createBuilder().build());
}
public CloseableHttpClient httpClient(ConfigurableApacheHttpClientFactory apacheHttpClientFactory) {
//todo: closeable
return apacheHttpClientFactory.createBuilder().build();
}
public PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder() {
return PoolingHttpClientConnectionManagerBuilder.create();
}
public Client feignClient(HttpClient httpClient) {
return new ApacheHttp5Client(httpClient);
}
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
requestTemplate.header("Accept", ContentType.APPLICATION_JSON.getMimeType());
requestTemplate.header("Content-Type", ContentType.APPLICATION_JSON.getMimeType());
};
}
public List requestInterceptors(HttpClientProperties customServerClientConfig,
RequestInterceptor requestInterceptor) {
List requestInterceptors = new ArrayList<>();
requestInterceptors.add(requestInterceptor);
HttpClientProperties.AuthorizationConfiguration authorizationConfiguration =
customServerClientConfig.getAuthorization();
if (customServerClientConfig.getAuthorization().isEnable()) {
requestInterceptors.add(new BasicAuthRequestInterceptor(authorizationConfiguration.getUsername(),
authorizationConfiguration.getPassword(), StandardCharsets.UTF_8));
}
return requestInterceptors;
}
public Contract feignContract() {
return new SpringMvcContract();
}
public Contract feignContractWithCustomSpringConversion(ConversionService feignConversionService,
List processors) {
return new SpringMvcContract(processors, feignConversionService);
}
public FormattingConversionService feignConversionService(List feignFormatterRegistrars) {
FormattingConversionService conversionService = new DefaultFormattingConversionService();
for (FeignFormatterRegistrar feignFormatterRegistrar : feignFormatterRegistrars) {
feignFormatterRegistrar.registerFormatters(conversionService);
}
return conversionService;
}
public Encoder feignEncoder(HttpMessageConverter
© 2015 - 2025 Weber Informatics LLC | Privacy Policy