Simplify marshalling of JSON messages

Fixes #558
This commit is contained in:
Marius Bogoevici
2016-05-31 23:19:21 -04:00
committed by Ilayaperumal Gopinathan
parent 99db7dff9b
commit 53d86f5523
2 changed files with 17 additions and 16 deletions

View File

@@ -119,22 +119,20 @@ public class MessageChannelBinderSupportTests {
}
@Test
public void testContentTypePreserved() throws IOException {
public void testContentTypePreservedForJson() throws IOException {
Message<String> 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<String> 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);
}

View File

@@ -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<T, C extends ConsumerProperties, P extends
Object originalContentType = message.getHeaders().get(MessageHeaders.CONTENT_TYPE);
//Pass content type as String since some transport adapters will exclude CONTENT_TYPE Header otherwise
Object contentType = JavaClassMimeTypeConversion.mimeTypeFromObject(originalPayload).toString();
Object contentType = JavaClassMimeTypeConversion
.mimeTypeFromObject(originalPayload, ObjectUtils.nullSafeToString(originalContentType)).toString();
Object payload = serializePayloadIfNecessary(originalPayload);
MessageValues messageValues = new MessageValues(message);
messageValues.setPayload(payload);
messageValues.put(MessageHeaders.CONTENT_TYPE, contentType);
if (originalContentType != null) {
if (originalContentType != null && !originalContentType.toString().equals(contentType.toString())) {
messageValues.put(BinderHeaders.BINDER_ORIGINAL_CONTENT_TYPE, originalContentType.toString());
}
return messageValues;
@@ -339,13 +341,14 @@ public abstract class AbstractBinder<T, C extends ConsumerProperties, P extends
private static ConcurrentMap<String, MimeType> 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);