Skip to content

Commit e433d8b

Browse files
committed
Polish
1 parent 5b29555 commit e433d8b

File tree

5 files changed

+45
-32
lines changed

5 files changed

+45
-32
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ protected AbstractJackson2Decoder(ObjectMapper mapper, MimeType... mimeTypes) {
6565

6666
@Override
6767
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
68-
JavaType javaType = objectMapper().getTypeFactory().constructType(elementType.getType());
68+
JavaType javaType = getObjectMapper().getTypeFactory().constructType(elementType.getType());
6969
// Skip String: CharSequenceDecoder + "*/*" comes after
7070
return (!CharSequence.class.isAssignableFrom(elementType.resolve(Object.class)) &&
71-
objectMapper().canDeserialize(javaType) && supportsMimeType(mimeType));
71+
getObjectMapper().canDeserialize(javaType) && supportsMimeType(mimeType));
7272
}
7373

7474
@Override
@@ -89,7 +89,7 @@ public Mono<Object> decodeToMono(Publisher<DataBuffer> input, ResolvableType ele
8989

9090
private Flux<TokenBuffer> tokenize(Publisher<DataBuffer> input, boolean tokenizeArrayElements) {
9191
try {
92-
JsonFactory factory = objectMapper().getFactory();
92+
JsonFactory factory = getObjectMapper().getFactory();
9393
JsonParser parser = factory.createNonBlockingByteArrayParser();
9494
Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(parser, tokenizeArrayElements);
9595
return Flux.from(input).flatMap(tokenizer).doFinally(t -> tokenizer.endOfInput());
@@ -111,8 +111,8 @@ private Flux<Object> decodeInternal(Flux<TokenBuffer> tokens, ResolvableType ele
111111
Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
112112

113113
ObjectReader reader = (jsonView != null ?
114-
objectMapper().readerWithView(jsonView).forType(javaType) :
115-
objectMapper().readerFor(javaType));
114+
getObjectMapper().readerWithView(jsonView).forType(javaType) :
115+
getObjectMapper().readerFor(javaType));
116116

117117
return tokens.map(tokenBuffer -> {
118118
try {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType
8181
Class<?> clazz = elementType.resolve(Object.class);
8282
return (Object.class == clazz) ||
8383
!String.class.isAssignableFrom(elementType.resolve(clazz)) &&
84-
objectMapper().canSerialize(clazz) && supportsMimeType(mimeType);
84+
getObjectMapper().canSerialize(clazz) && supportsMimeType(mimeType);
8585
}
8686

8787
@Override
@@ -116,7 +116,7 @@ private DataBuffer encodeValue(Object value, @Nullable MimeType mimeType, DataBu
116116
JavaType javaType = getJavaType(elementType.getType(), null);
117117
Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
118118
ObjectWriter writer = (jsonView != null ?
119-
objectMapper().writerWithView(jsonView) : objectMapper().writer());
119+
getObjectMapper().writerWithView(jsonView) : getObjectMapper().writer());
120120

121121
if (javaType.isContainerType()) {
122122
writer = writer.forType(javaType);

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ public abstract class Jackson2CodecSupport {
5656
private static final String JSON_VIEW_HINT_ERROR =
5757
"@JsonView only supported for write hints with exactly 1 class argument: ";
5858

59-
protected static final List<MimeType> JSON_MIME_TYPES = Arrays.asList(
60-
new MimeType("application", "json", StandardCharsets.UTF_8),
61-
new MimeType("application", "*+json", StandardCharsets.UTF_8));
59+
private static final List<MimeType> DEFAULT_MIME_TYPES = Collections.unmodifiableList(
60+
Arrays.asList(
61+
new MimeType("application", "json", StandardCharsets.UTF_8),
62+
new MimeType("application", "*+json", StandardCharsets.UTF_8)));
6263

6364

6465
private final ObjectMapper objectMapper;
@@ -72,15 +73,23 @@ public abstract class Jackson2CodecSupport {
7273
protected Jackson2CodecSupport(ObjectMapper objectMapper, MimeType... mimeTypes) {
7374
Assert.notNull(objectMapper, "ObjectMapper must not be null");
7475
this.objectMapper = objectMapper;
75-
this.mimeTypes = Collections.unmodifiableList(
76-
!ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES );
76+
this.mimeTypes = !ObjectUtils.isEmpty(mimeTypes) ?
77+
Collections.unmodifiableList(Arrays.asList(mimeTypes)) : DEFAULT_MIME_TYPES;
7778
}
7879

7980

80-
protected ObjectMapper objectMapper() {
81+
public ObjectMapper getObjectMapper() {
8182
return this.objectMapper;
8283
}
8384

85+
/**
86+
* Sub-classes should expose this as "decodable" or "encodable" mime types.
87+
*/
88+
protected List<MimeType> getMimeTypes() {
89+
return this.mimeTypes;
90+
}
91+
92+
8493
protected boolean supportsMimeType(@Nullable MimeType mimeType) {
8594
return (mimeType == null || this.mimeTypes.stream().anyMatch(m -> m.isCompatibleWith(mimeType)));
8695
}
@@ -111,7 +120,4 @@ protected MethodParameter getParameter(ResolvableType type) {
111120
@Nullable
112121
protected abstract <A extends Annotation> A getAnnotation(MethodParameter parameter, Class<A> annotType);
113122

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

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package org.springframework.http.codec.json;
1818

1919
import java.nio.charset.StandardCharsets;
20+
import java.util.Collections;
2021
import java.util.List;
2122
import java.util.Map;
2223

2324
import com.fasterxml.jackson.databind.ObjectMapper;
2425
import org.junit.Test;
25-
import org.springframework.util.MimeType;
2626
import reactor.core.publisher.Flux;
2727
import reactor.core.publisher.Mono;
2828
import reactor.test.StepVerifier;
@@ -33,11 +33,15 @@
3333
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
3434
import org.springframework.core.io.buffer.DataBuffer;
3535
import org.springframework.http.codec.Pojo;
36+
import org.springframework.util.MimeType;
3637

3738
import static java.util.Arrays.asList;
3839
import static java.util.Collections.emptyMap;
3940
import static java.util.Collections.singletonMap;
40-
import static org.junit.Assert.*;
41+
import static org.junit.Assert.assertEquals;
42+
import static org.junit.Assert.assertFalse;
43+
import static org.junit.Assert.assertNull;
44+
import static org.junit.Assert.assertTrue;
4145
import static org.springframework.core.ResolvableType.forClass;
4246
import static org.springframework.http.MediaType.APPLICATION_JSON;
4347
import static org.springframework.http.MediaType.APPLICATION_XML;
@@ -64,19 +68,20 @@ public void canDecode() {
6468
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
6569
}
6670

67-
@Test(expected = UnsupportedOperationException.class)
71+
@Test // SPR-15866
6872
public void canDecodeWithProvidedMimeType() {
6973
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
7074
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
71-
assertEquals(1, decoder.getDecodableMimeTypes().size());
72-
assertTrue(decoder.getDecodableMimeTypes().contains(textJavascript));
7375

74-
assertTrue(decoder.canDecode(forClass(Pojo.class), textJavascript));
75-
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON));
76+
assertEquals(Collections.singletonList(textJavascript), decoder.getDecodableMimeTypes());
77+
}
78+
79+
@Test(expected = UnsupportedOperationException.class)
80+
public void decodableMimeTypesIsImmutable() {
81+
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
82+
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
7683

77-
// Validate immutability of mime types list
7884
decoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
79-
assertEquals(1, decoder.getDecodableMimeTypes().size());
8085
}
8186

8287
@Test

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.nio.charset.StandardCharsets;
2020
import java.util.Arrays;
21+
import java.util.Collections;
2122
import java.util.Map;
2223

2324
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@@ -62,19 +63,20 @@ public void canEncode() {
6263
assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
6364
}
6465

65-
@Test(expected = UnsupportedOperationException.class)
66+
@Test // SPR-15866
6667
public void canEncodeWithCustomMimeType() {
67-
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
6868
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
6969
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
70-
assertEquals(1, encoder.getEncodableMimeTypes().size());
71-
assertTrue(encoder.getEncodableMimeTypes().contains(textJavascript));
7270

73-
assertTrue(encoder.canEncode(pojoType, textJavascript));
71+
assertEquals(Collections.singletonList(textJavascript), encoder.getEncodableMimeTypes());
72+
}
73+
74+
@Test(expected = UnsupportedOperationException.class)
75+
public void encodableMimeTypesIsImmutable() {
76+
MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
77+
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
7478

75-
// Validate immutability of mime types list
7679
encoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
77-
assertEquals(1, encoder.getEncodableMimeTypes().size());
7880
}
7981

8082
@Test

0 commit comments

Comments
 (0)