Add parametrized constructors to MappingJackson2MessageConverter

Issue: SPR-12724
This commit is contained in:
Sebastien Deleuze 2015-02-18 12:32:04 +01:00
parent 6062e15572
commit 8159aa99a1
2 changed files with 67 additions and 15 deletions

View File

@ -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);

View File

@ -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));