From 4d8fa19a3ac68c5ac043302b21f79c3aeb885e65 Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Mon, 7 Mar 2016 11:34:34 +0530 Subject: [PATCH] Support text/* contentType sent by non-SCSt applications - When deserializing the payload at the consumer endpoint, the non-byte stream payload type requires to use `String` object when the underlying message content-type is of any `text` type contentType (text/plain, text/xml and text/html). - This fix is only needed to support any non-SCSt applications that will have the 'text/*` contentType of the message that is being deserialized - Add test This resolves #403 --- .../binder/MessageChannelBinderSupportTests.java | 13 +++++++++++++ .../cloud/stream/binder/AbstractBinder.java | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) 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 c8389214e..3a2481f68 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 @@ -111,6 +111,19 @@ public class MessageChannelBinderSupportTests { assertNull(reconstructed.get(MessageHeaders.CONTENT_TYPE)); } + @Test + public void testStringXML() throws IOException { + Message message = MessageBuilder + .withPayload("") + .setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.TEXT_XML) + .build(); + Message converted = binder.serializePayloadIfNecessary(message).toMessage(); + assertEquals(MimeTypeUtils.TEXT_PLAIN, contentTypeResolver.resolve(converted.getHeaders())); + MessageValues reconstructed = binder.deserializePayloadIfNecessary(converted); + assertEquals("", reconstructed.getPayload()); + assertEquals(MimeTypeUtils.TEXT_XML.toString(), reconstructed.get(MessageHeaders.CONTENT_TYPE)); + } + @Test public void testContentTypePreserved() throws IOException { Message inbound = MessageBuilder.withPayload("{\"foo\":\"foo\"}") 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 a5a2bae91..540aa5f28 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 @@ -18,7 +18,6 @@ package org.springframework.cloud.stream.binder; import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON; import static org.springframework.util.MimeTypeUtils.APPLICATION_OCTET_STREAM; -import static org.springframework.util.MimeTypeUtils.TEXT_PLAIN; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -426,7 +425,7 @@ public abstract class AbstractBinder implements ApplicationContextAware, Init } private Object deserializePayload(byte[] bytes, MimeType contentType) { - if (TEXT_PLAIN.equals(contentType) || APPLICATION_JSON.equals(contentType)) { + if ("text".equalsIgnoreCase(contentType.getType()) || APPLICATION_JSON.equals(contentType)) { try { return new String(bytes, "UTF-8"); }