Skip to content

Commit 1dc3932

Browse files
sdeleuzejhoeller
authored andcommitted
Add parametrized constructors to MappingJackson2MessageConverter
Issue: SPR-12724 (cherry picked from commit 8159aa9)
1 parent 2a240b0 commit 1dc3932

File tree

2 files changed

+63
-15
lines changed

2 files changed

+63
-15
lines changed

spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
2121
import java.io.StringWriter;
2222
import java.io.Writer;
2323
import java.nio.charset.Charset;
24+
import java.util.Arrays;
2425
import java.util.concurrent.atomic.AtomicReference;
2526

2627
import com.fasterxml.jackson.core.JsonEncoding;
@@ -51,6 +52,7 @@
5152
*
5253
* @author Rossen Stoyanchev
5354
* @author Juergen Hoeller
55+
* @author Sebastien Deleuze
5456
* @since 4.0
5557
*/
5658
public class MappingJackson2MessageConverter extends AbstractMessageConverter {
@@ -65,8 +67,28 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
6567
private Boolean prettyPrint;
6668

6769

70+
/**
71+
* Construct a {@code MappingJackson2MessageConverter} supporting
72+
* the {@code application/json} MIME type.
73+
*/
6874
public MappingJackson2MessageConverter() {
6975
super(new MimeType("application", "json", Charset.forName("UTF-8")));
76+
initObjectMapper();
77+
}
78+
79+
/**
80+
* Construct a {@code MappingJackson2MessageConverter} supporting
81+
* one or more custom MIME types.
82+
* @param supportedMimeTypes the supported MIME types
83+
* @since 4.1.5
84+
*/
85+
public MappingJackson2MessageConverter(MimeType... supportedMimeTypes) {
86+
super(Arrays.asList(supportedMimeTypes));
87+
initObjectMapper();
88+
}
89+
90+
91+
private void initObjectMapper() {
7092
this.objectMapper = new ObjectMapper();
7193
this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
7294
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,39 +22,59 @@
2222
import java.util.HashMap;
2323
import java.util.Map;
2424

25-
import org.junit.Before;
25+
import com.fasterxml.jackson.databind.DeserializationFeature;
2626
import org.junit.Test;
2727

2828
import org.springframework.messaging.Message;
2929
import org.springframework.messaging.MessageHeaders;
3030
import org.springframework.messaging.support.MessageBuilder;
3131
import org.springframework.util.MimeType;
3232

33+
import static org.hamcrest.Matchers.*;
3334
import static org.junit.Assert.*;
3435

3536
/**
3637
* Test fixture for {@link org.springframework.messaging.converter.MappingJackson2MessageConverter}.
3738
*
3839
* @author Rossen Stoyanchev
40+
* @author Sebastien Deleuze
3941
*/
4042
public class MappingJackson2MessageConverterTests {
4143

4244
private static Charset UTF_8 = Charset.forName("UTF-8");
4345

44-
private MappingJackson2MessageConverter converter;
4546

47+
@Test
48+
public void defaultConstructor() {
49+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
50+
assertThat(converter.getSupportedMimeTypes(), contains(new MimeType("application", "json", UTF_8)));
51+
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
52+
}
53+
54+
@Test // SPR-12724
55+
public void mimetypeParametrizedConstructor() {
56+
MimeType mimetype = new MimeType("application", "xml", UTF_8);
57+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(mimetype);
58+
assertThat(converter.getSupportedMimeTypes(), contains(mimetype));
59+
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
60+
}
4661

47-
@Before
48-
public void setup() {
49-
this.converter = new MappingJackson2MessageConverter();
62+
@Test // SPR-12724
63+
public void mimetypesParametrizedConstructor() {
64+
MimeType jsonMimetype = new MimeType("application", "json", UTF_8);
65+
MimeType xmlMimetype = new MimeType("application", "xml", UTF_8);
66+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(jsonMimetype, xmlMimetype);
67+
assertThat(converter.getSupportedMimeTypes(), contains(jsonMimetype, xmlMimetype));
68+
assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
5069
}
5170

5271
@Test
5372
public void fromMessage() throws Exception {
73+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
5474
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
5575
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
5676
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
57-
MyBean actual = (MyBean) this.converter.fromMessage(message, MyBean.class);
77+
MyBean actual = (MyBean) converter.fromMessage(message, MyBean.class);
5878

5979
assertEquals("Foo", actual.getString());
6080
assertEquals(42, actual.getNumber());
@@ -66,11 +86,12 @@ public void fromMessage() throws Exception {
6686

6787
@Test
6888
public void fromMessageUntyped() throws Exception {
89+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
6990
String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],"
7091
+ "\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}";
7192
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
7293
@SuppressWarnings("unchecked")
73-
HashMap<String, Object> actual = (HashMap<String, Object>) this.converter.fromMessage(message, HashMap.class);
94+
HashMap<String, Object> actual = (HashMap<String, Object>) converter.fromMessage(message, HashMap.class);
7495

7596
assertEquals("Foo", actual.get("string"));
7697
assertEquals(42, actual.get("number"));
@@ -82,21 +103,24 @@ public void fromMessageUntyped() throws Exception {
82103

83104
@Test(expected = MessageConversionException.class)
84105
public void fromMessageInvalidJson() throws Exception {
106+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
85107
String payload = "FooBar";
86108
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
87-
this.converter.fromMessage(message, MyBean.class);
109+
converter.fromMessage(message, MyBean.class);
88110
}
89111

90112
@Test
91113
public void fromMessageValidJsonWithUnknownProperty() throws IOException {
114+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
92115
String payload = "{\"string\":\"string\",\"unknownProperty\":\"value\"}";
93116
Message<?> message = MessageBuilder.withPayload(payload.getBytes(UTF_8)).build();
94-
MyBean myBean = (MyBean)this.converter.fromMessage(message, MyBean.class);
117+
MyBean myBean = (MyBean)converter.fromMessage(message, MyBean.class);
95118
assertEquals("string", myBean.getString());
96119
}
97120

98121
@Test
99122
public void toMessage() throws Exception {
123+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
100124
MyBean payload = new MyBean();
101125
payload.setString("Foo");
102126
payload.setNumber(42);
@@ -105,7 +129,7 @@ public void toMessage() throws Exception {
105129
payload.setBool(true);
106130
payload.setBytes(new byte[]{0x1, 0x2});
107131

108-
Message<?> message = this.converter.toMessage(payload, null);
132+
Message<?> message = converter.toMessage(payload, null);
109133
String actual = new String((byte[]) message.getPayload(), UTF_8);
110134

111135
assertTrue(actual.contains("\"string\":\"Foo\""));
@@ -120,29 +144,31 @@ public void toMessage() throws Exception {
120144

121145
@Test
122146
public void toMessageUtf16() {
147+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
123148
Charset utf16 = Charset.forName("UTF-16BE");
124149
MimeType contentType = new MimeType("application", "json", utf16);
125150
Map<String, Object> map = new HashMap<>();
126151
map.put(MessageHeaders.CONTENT_TYPE, contentType);
127152
MessageHeaders headers = new MessageHeaders(map);
128153
String payload = "H\u00e9llo W\u00f6rld";
129-
Message<?> message = this.converter.toMessage(payload, headers);
154+
Message<?> message = converter.toMessage(payload, headers);
130155

131156
assertEquals("\"" + payload + "\"", new String((byte[]) message.getPayload(), utf16));
132157
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));
133158
}
134159

135160
@Test
136161
public void toMessageUtf16String() {
137-
this.converter.setSerializedPayloadClass(String.class);
162+
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
163+
converter.setSerializedPayloadClass(String.class);
138164

139165
Charset utf16 = Charset.forName("UTF-16BE");
140166
MimeType contentType = new MimeType("application", "json", utf16);
141167
Map<String, Object> map = new HashMap<>();
142168
map.put(MessageHeaders.CONTENT_TYPE, contentType);
143169
MessageHeaders headers = new MessageHeaders(map);
144170
String payload = "H\u00e9llo W\u00f6rld";
145-
Message<?> message = this.converter.toMessage(payload, headers);
171+
Message<?> message = converter.toMessage(payload, headers);
146172

147173
assertEquals("\"" + payload + "\"", message.getPayload());
148174
assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE));

0 commit comments

Comments
 (0)