Add parametrized constructors to MappingJackson2MessageConverter
Issue: SPR-12724
This commit is contained in:
parent
6062e15572
commit
8159aa99a1
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 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.
|
||||
|
@ -21,6 +21,7 @@ import java.io.IOException;
|
|||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonEncoding;
|
||||
|
@ -51,6 +52,7 @@ import org.springframework.util.MimeType;
|
|||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Juergen Hoeller
|
||||
* @author Sebastien Deleuze
|
||||
* @since 4.0
|
||||
*/
|
||||
public class MappingJackson2MessageConverter extends AbstractMessageConverter {
|
||||
|
@ -65,8 +67,34 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
|
|||
private Boolean prettyPrint;
|
||||
|
||||
|
||||
/**
|
||||
* Construct a {@code MappingJackson2MessageConverter} supporting {@code application/json} MIME type.
|
||||
*/
|
||||
public MappingJackson2MessageConverter() {
|
||||
super(new MimeType("application", "json", Charset.forName("UTF-8")));
|
||||
this(new MimeType("application", "json", Charset.forName("UTF-8")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a {@code MappingJackson2MessageConverter} supporting a single MIME type.
|
||||
* @param supportedMimeType the supported MIME type
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public MappingJackson2MessageConverter(MimeType supportedMimeType) {
|
||||
super(supportedMimeType);
|
||||
init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a {@code MappingJackson2MessageConverter} supporting multiple MIME types.
|
||||
* @param supportedMimeTypes the supported MIME types
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public MappingJackson2MessageConverter(Collection<MimeType> supportedMimeTypes) {
|
||||
super(supportedMimeTypes);
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
this.objectMapper = new ObjectMapper();
|
||||
this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
|
||||
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
|
|
|
@ -22,7 +22,8 @@ import java.util.Arrays;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Before;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import static org.hamcrest.Matchers.contains;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.messaging.Message;
|
||||
|
@ -41,20 +42,37 @@ public class MappingJackson2MessageConverterTests {
|
|||
|
||||
private static Charset UTF_8 = Charset.forName("UTF-8");
|
||||
|
||||
private MappingJackson2MessageConverter converter;
|
||||
@Test
|
||||
public void defaultConstructor() {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
assertThat(converter.getSupportedMimeTypes(), contains(new MimeType("application", "json", UTF_8)));
|
||||
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
|
||||
}
|
||||
|
||||
@Test // SPR-12724
|
||||
public void mimetypeParametrizedConstructor() {
|
||||
MimeType mimetype = new MimeType("application", "xml", UTF_8);
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(mimetype);
|
||||
assertThat(converter.getSupportedMimeTypes(), contains(mimetype));
|
||||
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
this.converter = new MappingJackson2MessageConverter();
|
||||
@Test // SPR-12724
|
||||
public void mimetypesParametrizedConstructor() {
|
||||
MimeType jsonMimetype = new MimeType("application", "json", UTF_8);
|
||||
MimeType xmlMimetype = new MimeType("application", "xml", UTF_8);
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(Arrays.asList(jsonMimetype, xmlMimetype));
|
||||
assertThat(converter.getSupportedMimeTypes(), contains(jsonMimetype, xmlMimetype));
|
||||
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromMessage() throws Exception {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
||||
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||
MyBean actual = (MyBean) this.converter.fromMessage(message, MyBean.class);
|
||||
MyBean actual = (MyBean) converter.fromMessage(message, MyBean.class);
|
||||
|
||||
assertEquals("Foo", actual.getString());
|
||||
assertEquals(42, actual.getNumber());
|
||||
|
@ -66,11 +84,12 @@ public class MappingJackson2MessageConverterTests {
|
|||
|
||||
@Test
|
||||
public void fromMessageUntyped() throws Exception {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
||||
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||
@SuppressWarnings("unchecked")
|
||||
HashMap<String, Object> actual = (HashMap<String, Object>) this.converter.fromMessage(message, HashMap.class);
|
||||
HashMap<String, Object> actual = (HashMap<String, Object>) converter.fromMessage(message, HashMap.class);
|
||||
|
||||
assertEquals("Foo", actual.get("string"));
|
||||
assertEquals(42, actual.get("number"));
|
||||
|
@ -82,21 +101,24 @@ public class MappingJackson2MessageConverterTests {
|
|||
|
||||
@Test(expected = MessageConversionException.class)
|
||||
public void fromMessageInvalidJson() throws Exception {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
String payload = "FooBar";
|
||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||
this.converter.fromMessage(message, MyBean.class);
|
||||
converter.fromMessage(message, MyBean.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromMessageValidJsonWithUnknownProperty() throws IOException {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
String payload = "{\"string\":\"string\",\"unknownProperty\":\"value\"}";
|
||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||
MyBean myBean = (MyBean)this.converter.fromMessage(message, MyBean.class);
|
||||
MyBean myBean = (MyBean)converter.fromMessage(message, MyBean.class);
|
||||
assertEquals("string", myBean.getString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toMessage() throws Exception {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
MyBean payload = new MyBean();
|
||||
payload.setString("Foo");
|
||||
payload.setNumber(42);
|
||||
|
@ -105,7 +127,7 @@ public class MappingJackson2MessageConverterTests {
|
|||
payload.setBool(true);
|
||||
payload.setBytes(new byte[]{0x1, 0x2});
|
||||
|
||||
Message<?> message = this.converter.toMessage(payload, null);
|
||||
Message<?> message = converter.toMessage(payload, null);
|
||||
String actual = new String((byte[]) message.getPayload(), UTF_8);
|
||||
|
||||
assertTrue(actual.contains("\"string\":\"Foo\""));
|
||||
|
@ -120,13 +142,14 @@ public class MappingJackson2MessageConverterTests {
|
|||
|
||||
@Test
|
||||
public void toMessageUtf16() {
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
Charset utf16 = Charset.forName("UTF-16BE");
|
||||
MimeType contentType = new MimeType("application", "json", utf16);
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
||||
MessageHeaders headers = new MessageHeaders(map);
|
||||
String payload = "H\u00e9llo W\u00f6rld";
|
||||
Message<?> message = this.converter.toMessage(payload, headers);
|
||||
Message<?> message = converter.toMessage(payload, headers);
|
||||
|
||||
assertEquals("\"" + payload + "\"", new String((byte[]) message.getPayload(), utf16));
|
||||
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
||||
|
@ -134,7 +157,8 @@ public class MappingJackson2MessageConverterTests {
|
|||
|
||||
@Test
|
||||
public void toMessageUtf16String() {
|
||||
this.converter.setSerializedPayloadClass(String.class);
|
||||
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||
converter.setSerializedPayloadClass(String.class);
|
||||
|
||||
Charset utf16 = Charset.forName("UTF-16BE");
|
||||
MimeType contentType = new MimeType("application", "json", utf16);
|
||||
|
@ -142,7 +166,7 @@ public class MappingJackson2MessageConverterTests {
|
|||
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
||||
MessageHeaders headers = new MessageHeaders(map);
|
||||
String payload = "H\u00e9llo W\u00f6rld";
|
||||
Message<?> message = this.converter.toMessage(payload, headers);
|
||||
Message<?> message = converter.toMessage(payload, headers);
|
||||
|
||||
assertEquals("\"" + payload + "\"", message.getPayload());
|
||||
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
||||
|
|
Loading…
Reference in New Issue