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
master
Sebastien Deleuze 11 years ago committed by Rossen Stoyanchev
parent 11c41993f1
commit 2b69c1f15b
  1. 32
      spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java
  2. 30
      spring-messaging/src/test/java/org/springframework/messaging/converter/DefaultContentTypeResolverTests.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.
* <p>
* 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 + "]";
}
}

@ -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<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
public void resolveNoContentTypeHeader() {
MessageHeaders headers = new MessageHeaders(Collections.<String, Object>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.<String, Object>emptyMap());

Loading…
Cancel
Save