From 8159aa99a1e5e8d3ff327549967c376fba7b3192 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Wed, 18 Feb 2015 12:32:04 +0100 Subject: [PATCH] Add parametrized constructors to MappingJackson2MessageConverter Issue: SPR-12724 --- .../MappingJackson2MessageConverter.java | 32 +++++++++++- .../MappingJackson2MessageConverterTests.java | 50 ++++++++++++++----- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java index b43cb576ae7..1578f9dea3e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java @@ -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 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); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java index 1b3ede7534b..e3da343dae9 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java @@ -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 actual = (HashMap) this.converter.fromMessage(message, HashMap.class); + HashMap actual = (HashMap) 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 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));