Skip to content

Commit 5b29555

Browse files
rlindoorenrstoyanchev
rlindooren
authored andcommitted
Jackson encoder and decoder should use provided mime types
Instead of always using the default JSON mime types
1 parent 645e349 commit 5b29555

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

spring-web/src/main/java/org/springframework/http/codec/json/Jackson2CodecSupport.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ public abstract class Jackson2CodecSupport {
7272
protected Jackson2CodecSupport(ObjectMapper objectMapper, MimeType... mimeTypes) {
7373
Assert.notNull(objectMapper, "ObjectMapper must not be null");
7474
this.objectMapper = objectMapper;
75-
this.mimeTypes = !ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES;
75+
this.mimeTypes = Collections.unmodifiableList(
76+
!ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES );
7677
}
7778

7879

@@ -110,4 +111,7 @@ protected MethodParameter getParameter(ResolvableType type) {
110111
@Nullable
111112
protected abstract <A extends Annotation> A getAnnotation(MethodParameter parameter, Class<A> annotType);
112113

114+
protected List<MimeType> getMimeTypes() {
115+
return mimeTypes;
116+
}
113117
}

spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonDecoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ public Jackson2JsonDecoder(ObjectMapper mapper, MimeType... mimeTypes) {
4242

4343
@Override
4444
public List<MimeType> getDecodableMimeTypes() {
45-
return JSON_MIME_TYPES;
45+
return getMimeTypes();
4646
}
4747
}

spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,6 @@ protected ObjectWriter customizeWriter(ObjectWriter writer, @Nullable MimeType m
7373

7474
@Override
7575
public List<MimeType> getEncodableMimeTypes() {
76-
return JSON_MIME_TYPES;
76+
return getMimeTypes();
7777
}
7878
}

spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616

1717
package org.springframework.http.codec.json;
1818

19+
import java.nio.charset.StandardCharsets;
1920
import java.util.List;
2021
import java.util.Map;
2122

2223
import com.fasterxml.jackson.databind.ObjectMapper;
23-
import org.junit.Ignore;
2424
import org.junit.Test;
25+
import org.springframework.util.MimeType;
2526
import reactor.core.publisher.Flux;
2627
import reactor.core.publisher.Mono;
2728
import reactor.test.StepVerifier;
@@ -63,6 +64,21 @@ public void canDecode() {
6364
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
6465
}
6566

67+
@Test(expected = UnsupportedOperationException.class)
68+
public void canDecodeWithProvidedMimeType() {
69+
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
70+
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
71+
assertEquals(1, decoder.getDecodableMimeTypes().size());
72+
assertTrue(decoder.getDecodableMimeTypes().contains(textJavascript));
73+
74+
assertTrue(decoder.canDecode(forClass(Pojo.class), textJavascript));
75+
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON));
76+
77+
// Validate immutability of mime types list
78+
decoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
79+
assertEquals(1, decoder.getDecodableMimeTypes().size());
80+
}
81+
6682
@Test
6783
public void decodePojo() throws Exception {
6884
Flux<DataBuffer> source = Flux.just(stringBuffer("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}"));

spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@
1616

1717
package org.springframework.http.codec.json;
1818

19+
import java.nio.charset.StandardCharsets;
1920
import java.util.Arrays;
2021
import java.util.Map;
2122

2223
import com.fasterxml.jackson.annotation.JsonTypeInfo;
2324
import com.fasterxml.jackson.annotation.JsonTypeName;
2425
import static java.util.Collections.*;
26+
import com.fasterxml.jackson.databind.ObjectMapper;
2527
import org.junit.Test;
28+
import static org.junit.Assert.assertEquals;
2629
import static org.springframework.http.MediaType.*;
2730
import static org.springframework.http.codec.json.Jackson2JsonEncoder.*;
2831
import static org.springframework.http.codec.json.JacksonViewBean.*;
32+
import org.springframework.util.MimeType;
2933
import reactor.core.publisher.Flux;
3034
import reactor.core.publisher.Mono;
3135
import reactor.test.StepVerifier;
@@ -58,6 +62,21 @@ public void canEncode() {
5862
assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
5963
}
6064

65+
@Test(expected = UnsupportedOperationException.class)
66+
public void canEncodeWithCustomMimeType() {
67+
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
68+
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
69+
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
70+
assertEquals(1, encoder.getEncodableMimeTypes().size());
71+
assertTrue(encoder.getEncodableMimeTypes().contains(textJavascript));
72+
73+
assertTrue(encoder.canEncode(pojoType, textJavascript));
74+
75+
// Validate immutability of mime types list
76+
encoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
77+
assertEquals(1, encoder.getEncodableMimeTypes().size());
78+
}
79+
6180
@Test
6281
public void canNotEncode() {
6382
assertFalse(this.encoder.canEncode(ResolvableType.forClass(String.class), null));

0 commit comments

Comments
 (0)