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");
|
* 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.
|
||||||
|
@ -21,6 +21,7 @@ import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonEncoding;
|
import com.fasterxml.jackson.core.JsonEncoding;
|
||||||
|
@ -51,6 +52,7 @@ import org.springframework.util.MimeType;
|
||||||
*
|
*
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
|
* @author Sebastien Deleuze
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public class MappingJackson2MessageConverter extends AbstractMessageConverter {
|
public class MappingJackson2MessageConverter extends AbstractMessageConverter {
|
||||||
|
@ -65,8 +67,34 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
|
||||||
private Boolean prettyPrint;
|
private Boolean prettyPrint;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a {@code MappingJackson2MessageConverter} supporting {@code application/json} MIME type.
|
||||||
|
*/
|
||||||
public MappingJackson2MessageConverter() {
|
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 = new ObjectMapper();
|
||||||
this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
|
this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
|
||||||
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 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.HashMap;
|
||||||
import java.util.Map;
|
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.junit.Test;
|
||||||
|
|
||||||
import org.springframework.messaging.Message;
|
import org.springframework.messaging.Message;
|
||||||
|
@ -41,20 +42,37 @@ public class MappingJackson2MessageConverterTests {
|
||||||
|
|
||||||
private static Charset UTF_8 = Charset.forName("UTF-8");
|
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
|
@Test // SPR-12724
|
||||||
public void setup() {
|
public void mimetypesParametrizedConstructor() {
|
||||||
this.converter = new MappingJackson2MessageConverter();
|
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
|
@Test
|
||||||
public void fromMessage() throws Exception {
|
public void fromMessage() throws Exception {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
||||||
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
||||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
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("Foo", actual.getString());
|
||||||
assertEquals(42, actual.getNumber());
|
assertEquals(42, actual.getNumber());
|
||||||
|
@ -66,11 +84,12 @@ public class MappingJackson2MessageConverterTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void fromMessageUntyped() throws Exception {
|
public void fromMessageUntyped() throws Exception {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
|
||||||
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
|
||||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||||
@SuppressWarnings("unchecked")
|
@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("Foo", actual.get("string"));
|
||||||
assertEquals(42, actual.get("number"));
|
assertEquals(42, actual.get("number"));
|
||||||
|
@ -82,21 +101,24 @@ public class MappingJackson2MessageConverterTests {
|
||||||
|
|
||||||
@Test(expected = MessageConversionException.class)
|
@Test(expected = MessageConversionException.class)
|
||||||
public void fromMessageInvalidJson() throws Exception {
|
public void fromMessageInvalidJson() throws Exception {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
String payload = "FooBar";
|
String payload = "FooBar";
|
||||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
||||||
this.converter.fromMessage(message, MyBean.class);
|
converter.fromMessage(message, MyBean.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void fromMessageValidJsonWithUnknownProperty() throws IOException {
|
public void fromMessageValidJsonWithUnknownProperty() throws IOException {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
String payload = "{\"string\":\"string\",\"unknownProperty\":\"value\"}";
|
String payload = "{\"string\":\"string\",\"unknownProperty\":\"value\"}";
|
||||||
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
|
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());
|
assertEquals("string", myBean.getString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void toMessage() throws Exception {
|
public void toMessage() throws Exception {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
MyBean payload = new MyBean();
|
MyBean payload = new MyBean();
|
||||||
payload.setString("Foo");
|
payload.setString("Foo");
|
||||||
payload.setNumber(42);
|
payload.setNumber(42);
|
||||||
|
@ -105,7 +127,7 @@ public class MappingJackson2MessageConverterTests {
|
||||||
payload.setBool(true);
|
payload.setBool(true);
|
||||||
payload.setBytes(new byte[]{0x1, 0x2});
|
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);
|
String actual = new String((byte[]) message.getPayload(), UTF_8);
|
||||||
|
|
||||||
assertTrue(actual.contains("\"string\":\"Foo\""));
|
assertTrue(actual.contains("\"string\":\"Foo\""));
|
||||||
|
@ -120,13 +142,14 @@ public class MappingJackson2MessageConverterTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void toMessageUtf16() {
|
public void toMessageUtf16() {
|
||||||
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
Charset utf16 = Charset.forName("UTF-16BE");
|
Charset utf16 = Charset.forName("UTF-16BE");
|
||||||
MimeType contentType = new MimeType("application", "json", utf16);
|
MimeType contentType = new MimeType("application", "json", utf16);
|
||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
||||||
MessageHeaders headers = new MessageHeaders(map);
|
MessageHeaders headers = new MessageHeaders(map);
|
||||||
String payload = "H\u00e9llo W\u00f6rld";
|
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("\"" + payload + "\"", new String((byte[]) message.getPayload(), utf16));
|
||||||
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
||||||
|
@ -134,7 +157,8 @@ public class MappingJackson2MessageConverterTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void toMessageUtf16String() {
|
public void toMessageUtf16String() {
|
||||||
this.converter.setSerializedPayloadClass(String.class);
|
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
|
||||||
|
converter.setSerializedPayloadClass(String.class);
|
||||||
|
|
||||||
Charset utf16 = Charset.forName("UTF-16BE");
|
Charset utf16 = Charset.forName("UTF-16BE");
|
||||||
MimeType contentType = new MimeType("application", "json", utf16);
|
MimeType contentType = new MimeType("application", "json", utf16);
|
||||||
|
@ -142,7 +166,7 @@ public class MappingJackson2MessageConverterTests {
|
||||||
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
map.put(MessageHeaders.CONTENT_TYPE, contentType);
|
||||||
MessageHeaders headers = new MessageHeaders(map);
|
MessageHeaders headers = new MessageHeaders(map);
|
||||||
String payload = "H\u00e9llo W\u00f6rld";
|
String payload = "H\u00e9llo W\u00f6rld";
|
||||||
Message<?> message = this.converter.toMessage(payload, headers);
|
Message<?> message = converter.toMessage(payload, headers);
|
||||||
|
|
||||||
assertEquals("\"" + payload + "\"", message.getPayload());
|
assertEquals("\"" + payload + "\"", message.getPayload());
|
||||||
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
|
||||||
|
|
Loading…
Reference in New Issue