提交 5b29555d 编写于 作者: R rlindooren 提交者: Rossen Stoyanchev

Jackson encoder and decoder should use provided mime types

Instead of always using the default JSON mime types
上级 645e3492
......@@ -72,7 +72,8 @@ public abstract class Jackson2CodecSupport {
protected Jackson2CodecSupport(ObjectMapper objectMapper, MimeType... mimeTypes) {
Assert.notNull(objectMapper, "ObjectMapper must not be null");
this.objectMapper = objectMapper;
this.mimeTypes = !ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES;
this.mimeTypes = Collections.unmodifiableList(
!ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES );
}
......@@ -110,4 +111,7 @@ public abstract class Jackson2CodecSupport {
@Nullable
protected abstract <A extends Annotation> A getAnnotation(MethodParameter parameter, Class<A> annotType);
protected List<MimeType> getMimeTypes() {
return mimeTypes;
}
}
......@@ -42,6 +42,6 @@ public class Jackson2JsonDecoder extends AbstractJackson2Decoder {
@Override
public List<MimeType> getDecodableMimeTypes() {
return JSON_MIME_TYPES;
return getMimeTypes();
}
}
......@@ -73,6 +73,6 @@ public class Jackson2JsonEncoder extends AbstractJackson2Encoder {
@Override
public List<MimeType> getEncodableMimeTypes() {
return JSON_MIME_TYPES;
return getMimeTypes();
}
}
......@@ -16,12 +16,13 @@
package org.springframework.http.codec.json;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.util.MimeType;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
......@@ -63,6 +64,21 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
}
@Test(expected = UnsupportedOperationException.class)
public void canDecodeWithProvidedMimeType() {
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
assertEquals(1, decoder.getDecodableMimeTypes().size());
assertTrue(decoder.getDecodableMimeTypes().contains(textJavascript));
assertTrue(decoder.canDecode(forClass(Pojo.class), textJavascript));
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON));
// Validate immutability of mime types list
decoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
assertEquals(1, decoder.getDecodableMimeTypes().size());
}
@Test
public void decodePojo() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}"));
......
......@@ -16,16 +16,20 @@
package org.springframework.http.codec.json;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import static java.util.Collections.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.springframework.http.MediaType.*;
import static org.springframework.http.codec.json.Jackson2JsonEncoder.*;
import static org.springframework.http.codec.json.JacksonViewBean.*;
import org.springframework.util.MimeType;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
......@@ -58,6 +62,21 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa
assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
}
@Test(expected = UnsupportedOperationException.class)
public void canEncodeWithCustomMimeType() {
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
assertEquals(1, encoder.getEncodableMimeTypes().size());
assertTrue(encoder.getEncodableMimeTypes().contains(textJavascript));
assertTrue(encoder.canEncode(pojoType, textJavascript));
// Validate immutability of mime types list
encoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
assertEquals(1, encoder.getEncodableMimeTypes().size());
}
@Test
public void canNotEncode() {
assertFalse(this.encoder.canEncode(ResolvableType.forClass(String.class), null));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册