Properly handle Flux<?> and Flux<Object> in WebFlux

Issue: SPR-15464
This commit is contained in:
Rossen Stoyanchev
2017-04-20 08:40:15 -04:00
parent a93698487e
commit cc102c2fcd
22 changed files with 72 additions and 37 deletions

View File

@@ -86,7 +86,7 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter<Objec
@Override
public boolean canWrite(ResolvableType elementType, MediaType mediaType) {
return mediaType == null || MediaType.TEXT_EVENT_STREAM.includes(mediaType) ||
ServerSentEvent.class.isAssignableFrom(elementType.getRawClass());
ServerSentEvent.class.isAssignableFrom(elementType.resolve(Object.class));
}
@Override

View File

@@ -104,10 +104,10 @@ public class Jackson2JsonEncoder extends Jackson2CodecSupport implements HttpMes
@Override
public boolean canEncode(ResolvableType elementType, MimeType mimeType) {
Class<?> clazz = elementType.getRawClass();
// Skip String: StringDecoder + "*/*" comes after
return (!String.class.isAssignableFrom(elementType.resolve(Object.class)) &&
this.objectMapper.canSerialize(clazz) && supportsMimeType(mimeType));
Class<?> clazz = elementType.resolve(Object.class);
return Object.class.equals(clazz) ||
!String.class.isAssignableFrom(elementType.resolve(clazz)) &&
this.objectMapper.canSerialize(clazz) && supportsMimeType(mimeType);
}
@Override

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2017 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.
@@ -55,7 +55,7 @@ public class Jaxb2XmlEncoder extends AbstractSingleValueEncoder<Object> {
@Override
public boolean canEncode(ResolvableType elementType, MimeType mimeType) {
if (super.canEncode(elementType, mimeType)) {
Class<?> outputClass = elementType.getRawClass();
Class<?> outputClass = elementType.resolve(Object.class);
return (outputClass.isAnnotationPresent(XmlRootElement.class) ||
outputClass.isAnnotationPresent(XmlType.class));
}

View File

@@ -27,6 +27,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
import org.springframework.http.MediaType;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
@@ -52,14 +53,16 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
@Test
public void canWrite() {
assertTrue(this.messageWriter.canWrite(forClass(Object.class), null));
assertFalse(this.messageWriter.canWrite(forClass(Object.class), new MediaType("foo", "bar")));
assertTrue(this.messageWriter.canWrite(null, MediaType.TEXT_EVENT_STREAM));
assertTrue(this.messageWriter.canWrite(forClass(ServerSentEvent.class), new MediaType("foo", "bar")));
}
@Test
public void canNotWrite() {
assertFalse(this.messageWriter.canWrite(forClass(Object.class), new MediaType("foo", "bar")));
// SPR-15464
assertTrue(this.messageWriter.canWrite(ResolvableType.NONE, MediaType.TEXT_EVENT_STREAM));
assertFalse(this.messageWriter.canWrite(ResolvableType.NONE, new MediaType("foo", "bar")));
}
@Test

View File

@@ -52,6 +52,9 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
assertTrue(this.encoder.canEncode(pojoType, APPLICATION_JSON));
assertTrue(this.encoder.canEncode(pojoType, null));
// SPR-15464
assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
}
@Test

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2017 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.
@@ -60,6 +60,9 @@ public class Jaxb2XmlEncoderTests extends AbstractDataBufferAllocatingTestCase {
assertFalse(this.encoder.canEncode(ResolvableType.forClass(getClass()),
MediaType.APPLICATION_XML));
// SPR-15464
assertFalse(this.encoder.canEncode(ResolvableType.NONE, null));
}
@Test