package myfeed.core; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor; import org.springframework.cloud.client.loadbalancer.RestTemplateCustomizer; import org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.hateoas.MediaTypes; import org.springframework.hateoas.hal.Jackson2HalModule; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.AsyncRestTemplate; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; /** * @author Spencer Gibb */ @Configuration public class MyfeedAutoConfig { @Bean public RestTemplateCustomizer restTemplateCustomizer(final RibbonClientHttpRequestFactory requestFactory) { return restTemplate -> { restTemplate.setRequestFactory(requestFactory); addConverters(restTemplate); }; } private void addConverters(RestTemplate restTemplate) { List<HttpMessageConverter<?>> converters = getHttpMessageConverters(); restTemplate.setMessageConverters(converters); } private List<HttpMessageConverter<?>> getHttpMessageConverters() { List<HttpMessageConverter<?>> converters = new ArrayList<>(); converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new Jackson2HalModule()); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(mapper); converter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON)); converters.add(converter); return converters; } @Bean public RibbonAsyncClientHttpRequestFactory asyncRequestFactory(LoadBalancerClient loadBalancerClient) { RibbonAsyncClientHttpRequestFactory requestFactory = new RibbonAsyncClientHttpRequestFactory(loadBalancerClient); requestFactory.setTaskExecutor(new SimpleAsyncTaskExecutor()); return requestFactory; } @Bean public AsyncRest asyncRest(LoadBalancerInterceptor interceptor, LoadBalancerClient loadBalancer) { RibbonAsyncClientHttpRequestFactory requestFactory = asyncRequestFactory(loadBalancer); Rest rest = new Rest(requestFactory); addConverters(rest); AsyncRest asyncRest = new AsyncRest(requestFactory, rest); asyncRest.setMessageConverters(getHttpMessageConverters()); return asyncRest; } @Bean @LoadBalanced public RestTemplate loadBalancedRestTemplate(RestTemplateCustomizer customizer) { return rest(customizer); } @Bean public Rest rest(RestTemplateCustomizer customizer) { Rest rest = new Rest(); customizer.customize(rest); return rest; } @Bean public AsyncRestTemplate asyncRestTemplate(LoadBalancerInterceptor interceptor, LoadBalancerClient loadBalancer) { return asyncRest(interceptor, loadBalancer); } @Bean public TraversonFactory traversonFactory(LoadBalancerClient loadBalancerClient) { return new TraversonFactory(loadBalancerClient); } @Bean public WhoAmIController whoAmIController() { return new WhoAmIController(); } }