Polish
This commit is contained in:
		
							parent
							
								
									5b29555d88
								
							
						
					
					
						commit
						e433d8b66a
					
				| 
						 | 
					@ -65,10 +65,10 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
 | 
						public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
 | 
				
			||||||
		JavaType javaType = objectMapper().getTypeFactory().constructType(elementType.getType());
 | 
							JavaType javaType = getObjectMapper().getTypeFactory().constructType(elementType.getType());
 | 
				
			||||||
		// Skip String: CharSequenceDecoder + "*/*" comes after
 | 
							// Skip String: CharSequenceDecoder + "*/*" comes after
 | 
				
			||||||
		return (!CharSequence.class.isAssignableFrom(elementType.resolve(Object.class)) &&
 | 
							return (!CharSequence.class.isAssignableFrom(elementType.resolve(Object.class)) &&
 | 
				
			||||||
				objectMapper().canDeserialize(javaType) && supportsMimeType(mimeType));
 | 
									getObjectMapper().canDeserialize(javaType) && supportsMimeType(mimeType));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
| 
						 | 
					@ -89,7 +89,7 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private Flux<TokenBuffer> tokenize(Publisher<DataBuffer> input, boolean tokenizeArrayElements) {
 | 
						private Flux<TokenBuffer> tokenize(Publisher<DataBuffer> input, boolean tokenizeArrayElements) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			JsonFactory factory = objectMapper().getFactory();
 | 
								JsonFactory factory = getObjectMapper().getFactory();
 | 
				
			||||||
			JsonParser parser = factory.createNonBlockingByteArrayParser();
 | 
								JsonParser parser = factory.createNonBlockingByteArrayParser();
 | 
				
			||||||
			Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(parser, tokenizeArrayElements);
 | 
								Jackson2Tokenizer tokenizer = new Jackson2Tokenizer(parser, tokenizeArrayElements);
 | 
				
			||||||
			return Flux.from(input).flatMap(tokenizer).doFinally(t -> tokenizer.endOfInput());
 | 
								return Flux.from(input).flatMap(tokenizer).doFinally(t -> tokenizer.endOfInput());
 | 
				
			||||||
| 
						 | 
					@ -111,8 +111,8 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple
 | 
				
			||||||
		Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
 | 
							Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ObjectReader reader = (jsonView != null ?
 | 
							ObjectReader reader = (jsonView != null ?
 | 
				
			||||||
				objectMapper().readerWithView(jsonView).forType(javaType) :
 | 
									getObjectMapper().readerWithView(jsonView).forType(javaType) :
 | 
				
			||||||
				objectMapper().readerFor(javaType));
 | 
									getObjectMapper().readerFor(javaType));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return tokens.map(tokenBuffer -> {
 | 
							return tokens.map(tokenBuffer -> {
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
 | 
				
			||||||
		Class<?> clazz = elementType.resolve(Object.class);
 | 
							Class<?> clazz = elementType.resolve(Object.class);
 | 
				
			||||||
		return (Object.class == clazz) ||
 | 
							return (Object.class == clazz) ||
 | 
				
			||||||
				!String.class.isAssignableFrom(elementType.resolve(clazz)) &&
 | 
									!String.class.isAssignableFrom(elementType.resolve(clazz)) &&
 | 
				
			||||||
						objectMapper().canSerialize(clazz) && supportsMimeType(mimeType);
 | 
											getObjectMapper().canSerialize(clazz) && supportsMimeType(mimeType);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
| 
						 | 
					@ -116,7 +116,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
 | 
				
			||||||
		JavaType javaType = getJavaType(elementType.getType(), null);
 | 
							JavaType javaType = getJavaType(elementType.getType(), null);
 | 
				
			||||||
		Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
 | 
							Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
 | 
				
			||||||
		ObjectWriter writer = (jsonView != null ?
 | 
							ObjectWriter writer = (jsonView != null ?
 | 
				
			||||||
				objectMapper().writerWithView(jsonView) : objectMapper().writer());
 | 
									getObjectMapper().writerWithView(jsonView) : getObjectMapper().writer());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (javaType.isContainerType()) {
 | 
							if (javaType.isContainerType()) {
 | 
				
			||||||
			writer = writer.forType(javaType);
 | 
								writer = writer.forType(javaType);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,9 +56,10 @@ public abstract class Jackson2CodecSupport {
 | 
				
			||||||
	private static final String JSON_VIEW_HINT_ERROR =
 | 
						private static final String JSON_VIEW_HINT_ERROR =
 | 
				
			||||||
			"@JsonView only supported for write hints with exactly 1 class argument: ";
 | 
								"@JsonView only supported for write hints with exactly 1 class argument: ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected static final List<MimeType> JSON_MIME_TYPES = Arrays.asList(
 | 
						private static final List<MimeType> DEFAULT_MIME_TYPES = Collections.unmodifiableList(
 | 
				
			||||||
 | 
								Arrays.asList(
 | 
				
			||||||
					new MimeType("application", "json", StandardCharsets.UTF_8),
 | 
										new MimeType("application", "json", StandardCharsets.UTF_8),
 | 
				
			||||||
				new MimeType("application", "*+json", StandardCharsets.UTF_8));
 | 
										new MimeType("application", "*+json", StandardCharsets.UTF_8)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private final ObjectMapper objectMapper;
 | 
						private final ObjectMapper objectMapper;
 | 
				
			||||||
| 
						 | 
					@ -72,15 +73,23 @@ public abstract class Jackson2CodecSupport {
 | 
				
			||||||
	protected Jackson2CodecSupport(ObjectMapper objectMapper, MimeType... mimeTypes) {
 | 
						protected Jackson2CodecSupport(ObjectMapper objectMapper, MimeType... mimeTypes) {
 | 
				
			||||||
		Assert.notNull(objectMapper, "ObjectMapper must not be null");
 | 
							Assert.notNull(objectMapper, "ObjectMapper must not be null");
 | 
				
			||||||
		this.objectMapper = objectMapper;
 | 
							this.objectMapper = objectMapper;
 | 
				
			||||||
		this.mimeTypes = Collections.unmodifiableList(
 | 
							this.mimeTypes = !ObjectUtils.isEmpty(mimeTypes) ?
 | 
				
			||||||
				!ObjectUtils.isEmpty(mimeTypes) ? Arrays.asList(mimeTypes) : JSON_MIME_TYPES );
 | 
									Collections.unmodifiableList(Arrays.asList(mimeTypes)) : DEFAULT_MIME_TYPES;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected ObjectMapper objectMapper() {
 | 
						public ObjectMapper getObjectMapper() {
 | 
				
			||||||
		return this.objectMapper;
 | 
							return this.objectMapper;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Sub-classes should expose this as "decodable" or "encodable" mime types.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						protected List<MimeType> getMimeTypes() {
 | 
				
			||||||
 | 
							return this.mimeTypes;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected boolean supportsMimeType(@Nullable MimeType mimeType) {
 | 
						protected boolean supportsMimeType(@Nullable MimeType mimeType) {
 | 
				
			||||||
		return (mimeType == null || this.mimeTypes.stream().anyMatch(m -> m.isCompatibleWith(mimeType)));
 | 
							return (mimeType == null || this.mimeTypes.stream().anyMatch(m -> m.isCompatibleWith(mimeType)));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -111,7 +120,4 @@ public abstract class Jackson2CodecSupport {
 | 
				
			||||||
	@Nullable
 | 
						@Nullable
 | 
				
			||||||
	protected abstract <A extends Annotation> A getAnnotation(MethodParameter parameter, Class<A> annotType);
 | 
						protected abstract <A extends Annotation> A getAnnotation(MethodParameter parameter, Class<A> annotType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected List<MimeType> getMimeTypes() {
 | 
					 | 
				
			||||||
		return mimeTypes;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,12 +17,12 @@
 | 
				
			||||||
package org.springframework.http.codec.json;
 | 
					package org.springframework.http.codec.json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.nio.charset.StandardCharsets;
 | 
					import java.nio.charset.StandardCharsets;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
import org.junit.Test;
 | 
					import org.junit.Test;
 | 
				
			||||||
import org.springframework.util.MimeType;
 | 
					 | 
				
			||||||
import reactor.core.publisher.Flux;
 | 
					import reactor.core.publisher.Flux;
 | 
				
			||||||
import reactor.core.publisher.Mono;
 | 
					import reactor.core.publisher.Mono;
 | 
				
			||||||
import reactor.test.StepVerifier;
 | 
					import reactor.test.StepVerifier;
 | 
				
			||||||
| 
						 | 
					@ -33,11 +33,15 @@ import org.springframework.core.codec.DecodingException;
 | 
				
			||||||
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
 | 
					import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
 | 
				
			||||||
import org.springframework.core.io.buffer.DataBuffer;
 | 
					import org.springframework.core.io.buffer.DataBuffer;
 | 
				
			||||||
import org.springframework.http.codec.Pojo;
 | 
					import org.springframework.http.codec.Pojo;
 | 
				
			||||||
 | 
					import org.springframework.util.MimeType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static java.util.Arrays.asList;
 | 
					import static java.util.Arrays.asList;
 | 
				
			||||||
import static java.util.Collections.emptyMap;
 | 
					import static java.util.Collections.emptyMap;
 | 
				
			||||||
import static java.util.Collections.singletonMap;
 | 
					import static java.util.Collections.singletonMap;
 | 
				
			||||||
import static org.junit.Assert.*;
 | 
					import static org.junit.Assert.assertEquals;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertFalse;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertNull;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertTrue;
 | 
				
			||||||
import static org.springframework.core.ResolvableType.forClass;
 | 
					import static org.springframework.core.ResolvableType.forClass;
 | 
				
			||||||
import static org.springframework.http.MediaType.APPLICATION_JSON;
 | 
					import static org.springframework.http.MediaType.APPLICATION_JSON;
 | 
				
			||||||
import static org.springframework.http.MediaType.APPLICATION_XML;
 | 
					import static org.springframework.http.MediaType.APPLICATION_XML;
 | 
				
			||||||
| 
						 | 
					@ -64,19 +68,20 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
 | 
				
			||||||
		assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
 | 
							assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Test(expected = UnsupportedOperationException.class)
 | 
						@Test // SPR-15866
 | 
				
			||||||
	public void canDecodeWithProvidedMimeType() {
 | 
						public void canDecodeWithProvidedMimeType() {
 | 
				
			||||||
		MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
							MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
				
			||||||
		Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
 | 
							Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
 | 
				
			||||||
		assertEquals(1, decoder.getDecodableMimeTypes().size());
 | 
					 | 
				
			||||||
		assertTrue(decoder.getDecodableMimeTypes().contains(textJavascript));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		assertTrue(decoder.canDecode(forClass(Pojo.class), textJavascript));
 | 
							assertEquals(Collections.singletonList(textJavascript), decoder.getDecodableMimeTypes());
 | 
				
			||||||
		assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON));
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Test(expected = UnsupportedOperationException.class)
 | 
				
			||||||
 | 
						public void decodableMimeTypesIsImmutable() {
 | 
				
			||||||
 | 
							MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
				
			||||||
 | 
							Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper(), textJavascript);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Validate immutability of mime types list
 | 
					 | 
				
			||||||
		decoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
 | 
							decoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
 | 
				
			||||||
		assertEquals(1, decoder.getDecodableMimeTypes().size());
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ package org.springframework.http.codec.json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.nio.charset.StandardCharsets;
 | 
					import java.nio.charset.StandardCharsets;
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
					import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
				
			||||||
| 
						 | 
					@ -62,19 +63,20 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa
 | 
				
			||||||
		assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
 | 
							assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Test(expected = UnsupportedOperationException.class)
 | 
						@Test // SPR-15866
 | 
				
			||||||
	public void canEncodeWithCustomMimeType() {
 | 
						public void canEncodeWithCustomMimeType() {
 | 
				
			||||||
		ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
 | 
					 | 
				
			||||||
		MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
							MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
				
			||||||
		Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
 | 
							Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
 | 
				
			||||||
		assertEquals(1, encoder.getEncodableMimeTypes().size());
 | 
					 | 
				
			||||||
		assertTrue(encoder.getEncodableMimeTypes().contains(textJavascript));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		assertTrue(encoder.canEncode(pojoType, textJavascript));
 | 
							assertEquals(Collections.singletonList(textJavascript), encoder.getEncodableMimeTypes());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Test(expected = UnsupportedOperationException.class)
 | 
				
			||||||
 | 
						public void encodableMimeTypesIsImmutable() {
 | 
				
			||||||
 | 
							MimeType textJavascript = new MimeType("text", "javascript", StandardCharsets.UTF_8);
 | 
				
			||||||
 | 
							Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(new ObjectMapper(), textJavascript);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Validate immutability of mime types list
 | 
					 | 
				
			||||||
		encoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
 | 
							encoder.getMimeTypes().add(new MimeType("text", "ecmascript"));
 | 
				
			||||||
		assertEquals(1, encoder.getEncodableMimeTypes().size());
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue