diff --git a/spring-cloud-stream-binders/spring-cloud-stream-binder-test/src/test/java/org/springframework/cloud/stream/binder/MessageChannelBinderSupportTests.java b/spring-cloud-stream-binders/spring-cloud-stream-binder-test/src/test/java/org/springframework/cloud/stream/binder/MessageChannelBinderSupportTests.java index 183a4e3db..584b422c8 100644 --- a/spring-cloud-stream-binders/spring-cloud-stream-binder-test/src/test/java/org/springframework/cloud/stream/binder/MessageChannelBinderSupportTests.java +++ b/spring-cloud-stream-binders/spring-cloud-stream-binder-test/src/test/java/org/springframework/cloud/stream/binder/MessageChannelBinderSupportTests.java @@ -119,22 +119,20 @@ public class MessageChannelBinderSupportTests { } @Test - public void testContentTypePreserved() throws IOException { + public void testContentTypePreservedForJson() throws IOException { Message inbound = MessageBuilder.withPayload("{\"foo\":\"foo\"}") .copyHeaders(Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)) .build(); - MessageValues convertedValues = binder.serializePayloadIfNecessary( - inbound); - + MessageValues convertedValues = binder.serializePayloadIfNecessary(inbound); Message converted = convertedValues.toMessage(); - - assertThat(contentTypeResolver.resolve(converted.getHeaders())).isEqualTo(MimeTypeUtils.TEXT_PLAIN); - assertThat(converted.getHeaders().get(BinderHeaders.BINDER_ORIGINAL_CONTENT_TYPE)).isEqualTo(MimeTypeUtils.APPLICATION_JSON.toString()); + assertThat(contentTypeResolver.resolve(converted.getHeaders())).isEqualTo(MimeTypeUtils.APPLICATION_JSON); + assertThat(converted.getHeaders().get(BinderHeaders.BINDER_ORIGINAL_CONTENT_TYPE)).isNull(); MessageValues reconstructed = binder.deserializePayloadIfNecessary(converted); assertThat(reconstructed.getPayload()).isEqualTo("{\"foo\":\"foo\"}"); assertThat(reconstructed.get(MessageHeaders.CONTENT_TYPE)).isEqualTo(MimeTypeUtils.APPLICATION_JSON_VALUE); } + @Test public void testContentTypePreservedForNonSCStApp() { Message inbound = MessageBuilder.withPayload("{\"foo\":\"bar\"}") @@ -180,35 +178,35 @@ public class MessageChannelBinderSupportTests { @Test public void mimeTypeIsSimpleObject() throws ClassNotFoundException { - MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new Object()); + MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new Object(), null); String className = JavaClassMimeTypeConversion.classNameFromMimeType(mt); assertThat(Class.forName(className)).isEqualTo(Object.class); } @Test public void mimeTypeIsObjectArray() throws ClassNotFoundException { - MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new String[0]); + MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new String[0], null); String className = JavaClassMimeTypeConversion.classNameFromMimeType(mt); assertThat(Class.forName(className)).isEqualTo(String[].class); } @Test public void mimeTypeIsMultiDimensionalObjectArray() throws ClassNotFoundException { - MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new String[0][0][0]); + MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new String[0][0][0], null); String className = JavaClassMimeTypeConversion.classNameFromMimeType(mt); assertThat(Class.forName(className)).isEqualTo(String[][][].class); } @Test public void mimeTypeIsPrimitiveArray() throws ClassNotFoundException { - MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new int[0]); + MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new int[0], null); String className = JavaClassMimeTypeConversion.classNameFromMimeType(mt); assertThat(Class.forName(className)).isEqualTo(int[].class); } @Test public void mimeTypeIsMultiDimensionalPrimitiveArray() throws ClassNotFoundException { - MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new int[0][0][0]); + MimeType mt = JavaClassMimeTypeConversion.mimeTypeFromObject(new int[0][0][0], null); String className = JavaClassMimeTypeConversion.classNameFromMimeType(mt); assertThat(Class.forName(className)).isEqualTo(int[][][].class); } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractBinder.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractBinder.java index b1752b18b..66645644a 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractBinder.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractBinder.java @@ -46,6 +46,7 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** @@ -200,12 +201,13 @@ public abstract class AbstractBinder mimeTypesCache = new ConcurrentHashMap<>(); - static MimeType mimeTypeFromObject(Object payload) { + static MimeType mimeTypeFromObject(Object payload, String originalContentType) { Assert.notNull(payload, "payload object cannot be null."); if (payload instanceof byte[]) { return MimeTypeUtils.APPLICATION_OCTET_STREAM; } if (payload instanceof String) { - return MimeTypeUtils.TEXT_PLAIN; + return MimeTypeUtils.APPLICATION_JSON_VALUE.equals(originalContentType) ? MimeTypeUtils.APPLICATION_JSON + : MimeTypeUtils.TEXT_PLAIN; } String className = payload.getClass().getName(); MimeType mimeType = mimeTypesCache.get(className);