diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java index 1d9e273ccb..73c013ac22 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java @@ -21,8 +21,9 @@ import org.springframework.util.MimeType; /** * A default {@link ContentTypeResolver} that checks the - * {@link MessageHeaders#CONTENT_TYPE} header or falls back to a default, if a default is - * configured. + * {@link MessageHeaders#CONTENT_TYPE} header or falls back to a default value, + * The header value is expected to be a {@link org.springframework.util.MimeType} + * or a String that can be parsed into a {@code MimeType}. * * @author Rossen Stoyanchev * @since 4.0 @@ -33,15 +34,18 @@ public class DefaultContentTypeResolver implements ContentTypeResolver { /** - * Set the default MIME type to use, if the message headers don't have one. - * By default this property is set to {@code null}. + * Set the default MIME type to use when there is no + * {@link MessageHeaders#CONTENT_TYPE} header present. + *

+ * This property does not have a default value. */ public void setDefaultMimeType(MimeType defaultMimeType) { this.defaultMimeType = defaultMimeType; } /** - * Return the default MIME type to use. + * Return the default MIME type to use if no + * {@link MessageHeaders#CONTENT_TYPE} header is present. */ public MimeType getDefaultMimeType() { return this.defaultMimeType; @@ -49,15 +53,25 @@ public class DefaultContentTypeResolver implements ContentTypeResolver { @Override public MimeType resolve(MessageHeaders headers) { - MimeType mimeType = null; - if (headers != null) { - mimeType = headers.get(MessageHeaders.CONTENT_TYPE, MimeType.class); + if (headers == null || headers.get(MessageHeaders.CONTENT_TYPE) == null) { + return this.defaultMimeType; + } + Object value = headers.get(MessageHeaders.CONTENT_TYPE); + if (value instanceof MimeType) { + return (MimeType) value; + } + else if (value instanceof String) { + return MimeType.valueOf((String) value); + } + else { + throw new IllegalArgumentException( + "Unknown type for contentType header value: " + value.getClass()); } - return (mimeType != null) ? mimeType : this.defaultMimeType; } @Override public String toString() { return "DefaultContentTypeResolver[" + "defaultMimeType=" + this.defaultMimeType + "]"; } + } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/DefaultContentTypeResolverTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/DefaultContentTypeResolverTests.java index e7a8b8b601..1d3d18db18 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/DefaultContentTypeResolverTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/DefaultContentTypeResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.DefaultContentTypeResolver; +import org.springframework.util.InvalidMimeTypeException; import org.springframework.util.MimeTypeUtils; import static org.junit.Assert.*; @@ -52,6 +53,31 @@ public class DefaultContentTypeResolverTests { assertEquals(MimeTypeUtils.APPLICATION_JSON, this.resolver.resolve(headers)); } + @Test + public void resolveStringContentType() { + Map map = new HashMap(); + map.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON_VALUE); + MessageHeaders headers = new MessageHeaders(map); + + assertEquals(MimeTypeUtils.APPLICATION_JSON, this.resolver.resolve(headers)); + } + + @Test(expected = InvalidMimeTypeException.class) + public void resolveInvalidStringContentType() { + Map map = new HashMap(); + map.put(MessageHeaders.CONTENT_TYPE, "invalidContentType"); + MessageHeaders headers = new MessageHeaders(map); + this.resolver.resolve(headers); + } + + @Test(expected = IllegalArgumentException.class) + public void resolveUnknownHeaderType() { + Map map = new HashMap(); + map.put(MessageHeaders.CONTENT_TYPE, new Integer(1)); + MessageHeaders headers = new MessageHeaders(map); + this.resolver.resolve(headers); + } + @Test public void resolveNoContentTypeHeader() { MessageHeaders headers = new MessageHeaders(Collections.emptyMap()); @@ -60,7 +86,7 @@ public class DefaultContentTypeResolverTests { } @Test - public void resolveFromDefaultMimeType() { + public void resolveDefaultMimeType() { this.resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON); MessageHeaders headers = new MessageHeaders(Collections.emptyMap());