From c9dc8f512280a8a3581caff7da7eea4ccc599eba Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 14 Oct 2014 12:41:41 -0600 Subject: [PATCH] use boots HttpMessageConverters class rather than copied list of converters --- .../cloud/netflix/feign/FeignBase.java | 103 ------------------ .../cloud/netflix/feign/FeignUtils.java | 20 ++++ .../cloud/netflix/feign/SpringDecoder.java | 20 ++-- .../cloud/netflix/feign/SpringEncoder.java | 16 +-- 4 files changed, 39 insertions(+), 120 deletions(-) delete mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignBase.java create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignUtils.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignBase.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignBase.java deleted file mode 100644 index de2b0eb3..00000000 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignBase.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.springframework.cloud.netflix.feign; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import javax.xml.transform.Source; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.converter.ByteArrayHttpMessageConverter; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.ResourceHttpMessageConverter; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.http.converter.feed.AtomFeedHttpMessageConverter; -import org.springframework.http.converter.feed.RssChannelHttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; -import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; -import org.springframework.http.converter.xml.SourceHttpMessageConverter; -import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; - -/** - * @author Spencer Gibb - */ -public class FeignBase { - public static final boolean romePresent = - ClassUtils.isPresent("com.sun.syndication.feed.WireFeed", FeignBase.class.getClassLoader()); - - public static final boolean jaxb2Present = - ClassUtils.isPresent("javax.xml.bind.Binder", FeignBase.class.getClassLoader()); - - public static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", FeignBase.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", FeignBase.class.getClassLoader()); - - public static final boolean jacksonPresent = - ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", FeignBase.class.getClassLoader()) && - ClassUtils.isPresent("org.codehaus.jackson.JsonGenerator", FeignBase.class.getClassLoader()); - - protected final List> messageConverters = new ArrayList>(); - - public FeignBase() { - addDefaultConverters(messageConverters); - } - - /** - * Create a new instance of the {@link SpringDecoder} using the given list of - * {@link HttpMessageConverter} to use - * @param messageConverters the list of {@link HttpMessageConverter} to use - */ - public FeignBase(List> messageConverters) { - Assert.notEmpty(messageConverters, "'messageConverters' must not be empty"); - this.messageConverters.addAll(messageConverters); - } - - @SuppressWarnings("deprecation") - protected void addDefaultConverters(List> messageConverters) { - messageConverters.add(new ByteArrayHttpMessageConverter()); - messageConverters.add(new StringHttpMessageConverter()); - messageConverters.add(new ResourceHttpMessageConverter()); - messageConverters.add(new SourceHttpMessageConverter()); - messageConverters.add(new AllEncompassingFormHttpMessageConverter()); - - if (romePresent) { - messageConverters.add(new AtomFeedHttpMessageConverter()); - messageConverters.add(new RssChannelHttpMessageConverter()); - } - if (jaxb2Present) { - messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); - } - if (jackson2Present) { - messageConverters.add(new MappingJackson2HttpMessageConverter()); - } - else if (jacksonPresent) { - messageConverters.add(new org.springframework.http.converter.json.MappingJacksonHttpMessageConverter()); - } - } - - /** - * Set the message body converters to use. - *

These converters are used to convert from and to HTTP requests and responses. - */ - public void setMessageConverters(List> messageConverters) { - Assert.notEmpty(messageConverters, "'messageConverters' must not be empty"); - this.messageConverters.clear(); - this.messageConverters.addAll(messageConverters); - } - - public List> getMessageConverters() { - return messageConverters; - } - - protected HttpHeaders getHttpHeaders(Map> headers) { - HttpHeaders httpHeaders = new HttpHeaders(); - for (Map.Entry> entry : headers.entrySet()) { - httpHeaders.put(entry.getKey(), new ArrayList<>(entry.getValue())); - } - return httpHeaders; - } - -} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignUtils.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignUtils.java new file mode 100644 index 00000000..3be7c035 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignUtils.java @@ -0,0 +1,20 @@ +package org.springframework.cloud.netflix.feign; + +import org.springframework.http.HttpHeaders; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +/** + * @author Spencer Gibb + */ +public class FeignUtils { + static HttpHeaders getHttpHeaders(Map> headers) { + HttpHeaders httpHeaders = new HttpHeaders(); + for (Map.Entry> entry : headers.entrySet()) { + httpHeaders.put(entry.getKey(), new ArrayList<>(entry.getValue())); + } + return httpHeaders; + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringDecoder.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringDecoder.java index 1c0df875..059e61ba 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringDecoder.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringDecoder.java @@ -3,12 +3,12 @@ package org.springframework.cloud.netflix.feign; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; -import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.client.HttpMessageConverterExtractor; import feign.FeignException; @@ -16,25 +16,25 @@ import feign.Response; import feign.codec.DecodeException; import feign.codec.Decoder; +import static org.springframework.cloud.netflix.feign.FeignUtils.getHttpHeaders; + /** * @author Spencer Gibb */ -public class SpringDecoder extends FeignBase implements Decoder { +public class SpringDecoder implements Decoder { + + @Autowired + HttpMessageConverters messageConverters; public SpringDecoder() { } - public SpringDecoder(List> messageConverters) { - super(messageConverters); - } - @Override - public Object decode(final Response response, Type type) throws IOException, - DecodeException, FeignException { + public Object decode(final Response response, Type type) throws IOException, FeignException { if (type instanceof Class) { @SuppressWarnings({ "unchecked", "rawtypes" }) HttpMessageConverterExtractor extractor = new HttpMessageConverterExtractor( - (Class) type, getMessageConverters()); + (Class) type, messageConverters.getConverters()); Object data = extractor.extractData(new FeignResponseAdapter(response)); return data; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringEncoder.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringEncoder.java index 0508500b..6c160679 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringEncoder.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/SpringEncoder.java @@ -8,6 +8,8 @@ import feign.codec.Encoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; @@ -17,19 +19,19 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; -import java.util.List; + +import static org.springframework.cloud.netflix.feign.FeignUtils.getHttpHeaders; /** * @author Spencer Gibb */ -public class SpringEncoder extends FeignBase implements Encoder { +public class SpringEncoder implements Encoder { private static final Logger logger = LoggerFactory.getLogger(SpringEncoder.class); - public SpringEncoder() { - } + @Autowired + HttpMessageConverters messageConverters; - public SpringEncoder(List> messageConverters) { - super(messageConverters); + public SpringEncoder() { } @Override @@ -46,7 +48,7 @@ public class SpringEncoder extends FeignBase implements Encoder { requestContentType = MediaType.valueOf(type); } - for (HttpMessageConverter messageConverter : getMessageConverters()) { + for (HttpMessageConverter messageConverter : messageConverters.getConverters()) { if (messageConverter.canWrite(requestType, requestContentType)) { if (logger.isDebugEnabled()) { if (requestContentType != null) {