Support String contentType headers in spring-messaging

After this change DefaultContentTypeResolver supports String-based
"contentType" header values in addition to MimeType-based.

Issue: SPR-11461
This commit is contained in:
Sebastien Deleuze 2014-02-27 10:48:14 +01:00 committed by Rossen Stoyanchev
parent 11c41993f1
commit 2b69c1f15b
2 changed files with 51 additions and 11 deletions

View File

@ -21,8 +21,9 @@ import org.springframework.util.MimeType;
/** /**
* A default {@link ContentTypeResolver} that checks the * A default {@link ContentTypeResolver} that checks the
* {@link MessageHeaders#CONTENT_TYPE} header or falls back to a default, if a default is * {@link MessageHeaders#CONTENT_TYPE} header or falls back to a default value,
* configured. * 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 * @author Rossen Stoyanchev
* @since 4.0 * @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. * Set the default MIME type to use when there is no
* By default this property is set to {@code null}. * {@link MessageHeaders#CONTENT_TYPE} header present.
* <p>
* This property does not have a default value.
*/ */
public void setDefaultMimeType(MimeType defaultMimeType) { public void setDefaultMimeType(MimeType defaultMimeType) {
this.defaultMimeType = 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() { public MimeType getDefaultMimeType() {
return this.defaultMimeType; return this.defaultMimeType;
@ -49,15 +53,25 @@ public class DefaultContentTypeResolver implements ContentTypeResolver {
@Override @Override
public MimeType resolve(MessageHeaders headers) { public MimeType resolve(MessageHeaders headers) {
MimeType mimeType = null; if (headers == null || headers.get(MessageHeaders.CONTENT_TYPE) == null) {
if (headers != null) { return this.defaultMimeType;
mimeType = headers.get(MessageHeaders.CONTENT_TYPE, MimeType.class); }
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 @Override
public String toString() { public String toString() {
return "DefaultContentTypeResolver[" + "defaultMimeType=" + this.defaultMimeType + "]"; return "DefaultContentTypeResolver[" + "defaultMimeType=" + this.defaultMimeType + "]";
} }
} }

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.junit.Test;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.DefaultContentTypeResolver; import org.springframework.messaging.converter.DefaultContentTypeResolver;
import org.springframework.util.InvalidMimeTypeException;
import org.springframework.util.MimeTypeUtils; import org.springframework.util.MimeTypeUtils;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -52,6 +53,31 @@ public class DefaultContentTypeResolverTests {
assertEquals(MimeTypeUtils.APPLICATION_JSON, this.resolver.resolve(headers)); assertEquals(MimeTypeUtils.APPLICATION_JSON, this.resolver.resolve(headers));
} }
@Test
public void resolveStringContentType() {
Map<String, Object> map = new HashMap<String, Object>();
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<String, Object> map = new HashMap<String, Object>();
map.put(MessageHeaders.CONTENT_TYPE, "invalidContentType");
MessageHeaders headers = new MessageHeaders(map);
this.resolver.resolve(headers);
}
@Test(expected = IllegalArgumentException.class)
public void resolveUnknownHeaderType() {
Map<String, Object> map = new HashMap<String, Object>();
map.put(MessageHeaders.CONTENT_TYPE, new Integer(1));
MessageHeaders headers = new MessageHeaders(map);
this.resolver.resolve(headers);
}
@Test @Test
public void resolveNoContentTypeHeader() { public void resolveNoContentTypeHeader() {
MessageHeaders headers = new MessageHeaders(Collections.<String, Object>emptyMap()); MessageHeaders headers = new MessageHeaders(Collections.<String, Object>emptyMap());
@ -60,7 +86,7 @@ public class DefaultContentTypeResolverTests {
} }
@Test @Test
public void resolveFromDefaultMimeType() { public void resolveDefaultMimeType() {
this.resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON); this.resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
MessageHeaders headers = new MessageHeaders(Collections.<String, Object>emptyMap()); MessageHeaders headers = new MessageHeaders(Collections.<String, Object>emptyMap());