Split HttpMessageConverter into ~Reader and ~Writer
This commit is contained in:
@@ -36,7 +36,7 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.stereotype.Controller;
|
||||
@@ -197,7 +197,7 @@ public class DispatcherHandlerErrorTests {
|
||||
@Bean
|
||||
public ResponseBodyResultHandler resultHandler() {
|
||||
return new ResponseBodyResultHandler(
|
||||
Collections.singletonList(new CodecHttpMessageConverter<>(new StringEncoder())),
|
||||
Collections.singletonList(new EncoderHttpMessageWriter<>(new StringEncoder())),
|
||||
new DefaultConversionService());
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import org.junit.Test;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.web.context.support.StaticWebApplicationContext;
|
||||
import org.springframework.web.reactive.result.view.HttpMessageConverterView;
|
||||
import org.springframework.web.reactive.result.view.HttpMessageWriterView;
|
||||
import org.springframework.web.reactive.result.view.UrlBasedViewResolver;
|
||||
import org.springframework.web.reactive.result.view.View;
|
||||
import org.springframework.web.reactive.result.view.freemarker.FreeMarkerConfigurer;
|
||||
@@ -80,7 +80,7 @@ public class ViewResolverRegistryTests {
|
||||
|
||||
@Test
|
||||
public void defaultViews() throws Exception {
|
||||
View view = new HttpMessageConverterView(new JacksonJsonEncoder());
|
||||
View view = new HttpMessageWriterView(new JacksonJsonEncoder());
|
||||
this.registry.defaultViews(view);
|
||||
|
||||
assertEquals(1, this.registry.getDefaultViews().size());
|
||||
|
||||
@@ -43,8 +43,10 @@ import org.springframework.http.MediaType;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2Decoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2Encoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.DecoderHttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.HttpMessageWriter;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.util.MimeType;
|
||||
@@ -56,7 +58,7 @@ import org.springframework.web.reactive.result.method.annotation.RequestMappingH
|
||||
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
|
||||
import org.springframework.web.reactive.result.method.annotation.ResponseBodyResultHandler;
|
||||
import org.springframework.web.reactive.result.method.annotation.ResponseEntityResultHandler;
|
||||
import org.springframework.web.reactive.result.view.HttpMessageConverterView;
|
||||
import org.springframework.web.reactive.result.view.HttpMessageWriterView;
|
||||
import org.springframework.web.reactive.result.view.View;
|
||||
import org.springframework.web.reactive.result.view.ViewResolutionResultHandler;
|
||||
import org.springframework.web.reactive.result.view.ViewResolver;
|
||||
@@ -142,15 +144,15 @@ public class WebReactiveConfigurationTests {
|
||||
RequestMappingHandlerAdapter adapter = context.getBean(name, RequestMappingHandlerAdapter.class);
|
||||
assertNotNull(adapter);
|
||||
|
||||
List<HttpMessageConverter<?>> converters = adapter.getMessageConverters();
|
||||
assertEquals(6, converters.size());
|
||||
List<HttpMessageReader<?>> readers = adapter.getMessageReaders();
|
||||
assertEquals(5, readers.size());
|
||||
|
||||
assertHasConverter(converters, ByteBuffer.class, APPLICATION_OCTET_STREAM, APPLICATION_OCTET_STREAM);
|
||||
assertHasConverter(converters, String.class, TEXT_PLAIN, TEXT_PLAIN);
|
||||
assertHasConverter(converters, Resource.class, IMAGE_PNG, IMAGE_PNG);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_XML, APPLICATION_XML);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_JSON, APPLICATION_JSON);
|
||||
assertHasConverter(converters, TestBean.class, null, MediaType.parseMediaType("text/event-stream"));
|
||||
assertHasMessageReader(readers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
||||
assertHasMessageReader(readers, String.class, TEXT_PLAIN);
|
||||
assertHasMessageReader(readers, Resource.class, IMAGE_PNG);
|
||||
assertHasMessageReader(readers, TestBean.class, APPLICATION_XML);
|
||||
assertHasMessageReader(readers, TestBean.class, APPLICATION_JSON);
|
||||
assertHasMessageReader(readers, TestBean.class, null);
|
||||
|
||||
name = "mvcConversionService";
|
||||
ConversionService service = context.getBean(name, ConversionService.class);
|
||||
@@ -170,11 +172,11 @@ public class WebReactiveConfigurationTests {
|
||||
RequestMappingHandlerAdapter adapter = context.getBean(name, RequestMappingHandlerAdapter.class);
|
||||
assertNotNull(adapter);
|
||||
|
||||
List<HttpMessageConverter<?>> converters = adapter.getMessageConverters();
|
||||
assertEquals(2, converters.size());
|
||||
List<HttpMessageReader<?>> messageReaders = adapter.getMessageReaders();
|
||||
assertEquals(2, messageReaders.size());
|
||||
|
||||
assertHasConverter(converters, String.class, TEXT_PLAIN, TEXT_PLAIN);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_XML, APPLICATION_XML);
|
||||
assertHasMessageReader(messageReaders, String.class, TEXT_PLAIN);
|
||||
assertHasMessageReader(messageReaders, TestBean.class, APPLICATION_XML);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -199,15 +201,15 @@ public class WebReactiveConfigurationTests {
|
||||
|
||||
assertEquals(0, handler.getOrder());
|
||||
|
||||
List<HttpMessageConverter<?>> converters = handler.getMessageConverters();
|
||||
assertEquals(6, converters.size());
|
||||
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
|
||||
assertEquals(6, writers.size());
|
||||
|
||||
assertHasConverter(converters, ByteBuffer.class, APPLICATION_OCTET_STREAM, APPLICATION_OCTET_STREAM);
|
||||
assertHasConverter(converters, String.class, TEXT_PLAIN, TEXT_PLAIN);
|
||||
assertHasConverter(converters, Resource.class, IMAGE_PNG, IMAGE_PNG);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_XML, APPLICATION_XML);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_JSON, APPLICATION_JSON);
|
||||
assertHasConverter(converters, TestBean.class, null, MediaType.parseMediaType("text/event-stream"));
|
||||
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
||||
assertHasMessageWriter(writers, String.class, TEXT_PLAIN);
|
||||
assertHasMessageWriter(writers, Resource.class, IMAGE_PNG);
|
||||
assertHasMessageWriter(writers, TestBean.class, APPLICATION_XML);
|
||||
assertHasMessageWriter(writers, TestBean.class, APPLICATION_JSON);
|
||||
assertHasMessageWriter(writers, TestBean.class, MediaType.parseMediaType("text/event-stream"));
|
||||
|
||||
name = "mvcContentTypeResolver";
|
||||
RequestedContentTypeResolver resolver = context.getBean(name, RequestedContentTypeResolver.class);
|
||||
@@ -224,15 +226,15 @@ public class WebReactiveConfigurationTests {
|
||||
|
||||
assertEquals(100, handler.getOrder());
|
||||
|
||||
List<HttpMessageConverter<?>> converters = handler.getMessageConverters();
|
||||
assertEquals(6, converters.size());
|
||||
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
|
||||
assertEquals(6, writers.size());
|
||||
|
||||
assertHasConverter(converters, ByteBuffer.class, APPLICATION_OCTET_STREAM, APPLICATION_OCTET_STREAM);
|
||||
assertHasConverter(converters, String.class, TEXT_PLAIN, TEXT_PLAIN);
|
||||
assertHasConverter(converters, Resource.class, IMAGE_PNG, IMAGE_PNG);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_XML, APPLICATION_XML);
|
||||
assertHasConverter(converters, TestBean.class, APPLICATION_JSON, APPLICATION_JSON);
|
||||
assertHasConverter(converters, TestBean.class, null, MediaType.parseMediaType("text/event-stream"));
|
||||
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
||||
assertHasMessageWriter(writers, String.class, TEXT_PLAIN);
|
||||
assertHasMessageWriter(writers, Resource.class, IMAGE_PNG);
|
||||
assertHasMessageWriter(writers, TestBean.class, APPLICATION_XML);
|
||||
assertHasMessageWriter(writers, TestBean.class, APPLICATION_JSON);
|
||||
assertHasMessageWriter(writers, TestBean.class, null);
|
||||
|
||||
name = "mvcContentTypeResolver";
|
||||
RequestedContentTypeResolver resolver = context.getBean(name, RequestedContentTypeResolver.class);
|
||||
@@ -261,12 +263,18 @@ public class WebReactiveConfigurationTests {
|
||||
}
|
||||
|
||||
|
||||
private void assertHasConverter(List<HttpMessageConverter<?>> converters, Class<?> clazz,
|
||||
MediaType readMediaType, MediaType writeMediaType) {
|
||||
private void assertHasMessageReader(List<HttpMessageReader<?>> readers, Class<?> clazz, MediaType mediaType) {
|
||||
ResolvableType type = ResolvableType.forClass(clazz);
|
||||
assertTrue(converters.stream()
|
||||
.filter(c -> (readMediaType == null || c.canRead(type, readMediaType))
|
||||
&& (writeMediaType == null || c.canWrite(type, writeMediaType)))
|
||||
assertTrue(readers.stream()
|
||||
.filter(c -> mediaType == null || c.canRead(type, mediaType))
|
||||
.findAny()
|
||||
.isPresent());
|
||||
}
|
||||
|
||||
private void assertHasMessageWriter(List<HttpMessageWriter<?>> writers, Class<?> clazz, MediaType mediaType) {
|
||||
ResolvableType type = ResolvableType.forClass(clazz);
|
||||
assertTrue(writers.stream()
|
||||
.filter(c -> mediaType == null || c.canWrite(type, mediaType))
|
||||
.findAny()
|
||||
.isPresent());
|
||||
}
|
||||
@@ -293,13 +301,23 @@ public class WebReactiveConfigurationTests {
|
||||
static class CustomMessageConverterConfig extends WebReactiveConfiguration {
|
||||
|
||||
@Override
|
||||
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
|
||||
converters.add(new CodecHttpMessageConverter<>(new StringEncoder(), new StringDecoder()));
|
||||
protected void configureMessageReaders(List<HttpMessageReader<?>> messageReaders) {
|
||||
messageReaders.add(new DecoderHttpMessageReader<>(new StringDecoder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
|
||||
converters.add(new CodecHttpMessageConverter<>(new Jaxb2Encoder(), new Jaxb2Decoder()));
|
||||
protected void configureMessageWriters(List<HttpMessageWriter<?>> messageWriters) {
|
||||
messageWriters.add(new EncoderHttpMessageWriter<>(new StringEncoder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void extendMessageReaders(List<HttpMessageReader<?>> messageReaders) {
|
||||
messageReaders.add(new DecoderHttpMessageReader<>(new Jaxb2Decoder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void extendMessageWriters(List<HttpMessageWriter<?>> messageWriters) {
|
||||
messageWriters.add(new EncoderHttpMessageWriter<>(new Jaxb2Encoder()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,7 +327,7 @@ public class WebReactiveConfigurationTests {
|
||||
@Override
|
||||
protected void configureViewResolvers(ViewResolverRegistry registry) {
|
||||
registry.freeMarker();
|
||||
registry.defaultViews(new HttpMessageConverterView(new JacksonJsonEncoder()));
|
||||
registry.defaultViews(new HttpMessageWriterView(new JacksonJsonEncoder()));
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -45,8 +45,8 @@ import org.springframework.http.HttpEntity;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.RequestEntity;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.DecoderHttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.HttpMessageReader;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.ui.ExtendedModelMap;
|
||||
@@ -66,7 +66,7 @@ import static org.springframework.core.ResolvableType.forClassWithGenerics;
|
||||
/**
|
||||
* Unit tests for {@link HttpEntityArgumentResolver}.When adding a test also
|
||||
* consider whether the logic under test is in a parent class, then see:
|
||||
* {@link MessageConverterArgumentResolverTests}.
|
||||
* {@link MessageReaderArgumentResolverTests}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
@@ -89,14 +89,14 @@ public class HttpEntityArgumentResolverTests {
|
||||
}
|
||||
|
||||
private HttpEntityArgumentResolver createResolver() {
|
||||
List<HttpMessageConverter<?>> converters = new ArrayList<>();
|
||||
converters.add(new CodecHttpMessageConverter<>(new StringDecoder()));
|
||||
List<HttpMessageReader<?>> readers = new ArrayList<>();
|
||||
readers.add(new DecoderHttpMessageReader<>(new StringDecoder()));
|
||||
|
||||
FormattingConversionService service = new DefaultFormattingConversionService();
|
||||
service.addConverter(new MonoToCompletableFutureConverter());
|
||||
service.addConverter(new ReactorToRxJava1Converter());
|
||||
|
||||
return new HttpEntityArgumentResolver(converters, service);
|
||||
return new HttpEntityArgumentResolver(readers, service);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@ import org.springframework.format.support.FormattingConversionService;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.codec.json.JacksonJsonDecoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.DecoderHttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.HttpMessageReader;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.validation.Errors;
|
||||
@@ -72,12 +72,12 @@ import static org.springframework.core.ResolvableType.forClass;
|
||||
import static org.springframework.core.ResolvableType.forClassWithGenerics;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AbstractMessageConverterArgumentResolver}.
|
||||
* Unit tests for {@link AbstractMessageReaderArgumentResolver}.
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class MessageConverterArgumentResolverTests {
|
||||
public class MessageReaderArgumentResolverTests {
|
||||
|
||||
private AbstractMessageConverterArgumentResolver resolver = resolver(new JacksonJsonDecoder());
|
||||
private AbstractMessageReaderArgumentResolver resolver = resolver(new JacksonJsonDecoder());
|
||||
|
||||
private ServerWebExchange exchange;
|
||||
|
||||
@@ -276,16 +276,16 @@ public class MessageConverterArgumentResolverTests {
|
||||
}
|
||||
|
||||
@SuppressWarnings("Convert2MethodRef")
|
||||
private AbstractMessageConverterArgumentResolver resolver(Decoder<?>... decoders) {
|
||||
private AbstractMessageReaderArgumentResolver resolver(Decoder<?>... decoders) {
|
||||
|
||||
List<HttpMessageConverter<?>> converters = new ArrayList<>();
|
||||
Arrays.asList(decoders).forEach(decoder -> converters.add(new CodecHttpMessageConverter<>(decoder)));
|
||||
List<HttpMessageReader<?>> readers = new ArrayList<>();
|
||||
Arrays.asList(decoders).forEach(decoder -> readers.add(new DecoderHttpMessageReader<>(decoder)));
|
||||
|
||||
FormattingConversionService service = new DefaultFormattingConversionService();
|
||||
service.addConverter(new MonoToCompletableFutureConverter());
|
||||
service.addConverter(new ReactorToRxJava1Converter());
|
||||
|
||||
return new AbstractMessageConverterArgumentResolver(converters, service, new TestBeanValidator()) {};
|
||||
return new AbstractMessageReaderArgumentResolver(readers, service, new TestBeanValidator()) {};
|
||||
}
|
||||
|
||||
private DataBuffer dataBuffer(String body) {
|
||||
@@ -49,9 +49,9 @@ import org.springframework.core.io.buffer.support.DataBufferTestUtils;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2Encoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageWriter;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
@@ -70,12 +70,12 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8;
|
||||
import static org.springframework.web.reactive.HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AbstractMessageConverterResultHandler}.
|
||||
* Unit tests for {@link AbstractMessageWriterResultHandler}.
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class MessageConverterResultHandlerTests {
|
||||
public class MessageWriterResultHandlerTests {
|
||||
|
||||
private AbstractMessageConverterResultHandler resultHandler;
|
||||
private AbstractMessageWriterResultHandler resultHandler;
|
||||
|
||||
private MockServerHttpResponse response = new MockServerHttpResponse();
|
||||
|
||||
@@ -131,8 +131,8 @@ public class MessageConverterResultHandlerTests {
|
||||
ByteArrayOutputStream body = new ByteArrayOutputStream();
|
||||
ResolvableType type = ResolvableType.forType(OutputStream.class);
|
||||
|
||||
HttpMessageConverter<?> converter = new CodecHttpMessageConverter<>(new ByteBufferEncoder());
|
||||
Mono<Void> mono = createResultHandler(converter).writeBody(this.exchange, body, type, returnType(type));
|
||||
HttpMessageWriter<?> writer = new EncoderHttpMessageWriter<>(new ByteBufferEncoder());
|
||||
Mono<Void> mono = createResultHandler(writer).writeBody(this.exchange, body, type, returnType(type));
|
||||
|
||||
TestSubscriber.subscribe(mono).assertError(IllegalStateException.class);
|
||||
}
|
||||
@@ -175,18 +175,18 @@ public class MessageConverterResultHandlerTests {
|
||||
return ResolvableMethod.onClass(TestController.class).returning(bodyType).resolveReturnType();
|
||||
}
|
||||
|
||||
private AbstractMessageConverterResultHandler createResultHandler(HttpMessageConverter<?>... converters) {
|
||||
List<HttpMessageConverter<?>> converterList;
|
||||
if (ObjectUtils.isEmpty(converters)) {
|
||||
converterList = new ArrayList<>();
|
||||
converterList.add(new CodecHttpMessageConverter<>(new ByteBufferEncoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new StringEncoder()));
|
||||
converterList.add(new ResourceHttpMessageConverter());
|
||||
converterList.add(new CodecHttpMessageConverter<>(new Jaxb2Encoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new JacksonJsonEncoder()));
|
||||
private AbstractMessageWriterResultHandler createResultHandler(HttpMessageWriter<?>... writers) {
|
||||
List<HttpMessageWriter<?>> writerList;
|
||||
if (ObjectUtils.isEmpty(writers)) {
|
||||
writerList = new ArrayList<>();
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new StringEncoder()));
|
||||
writerList.add(new ResourceHttpMessageWriter());
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2Encoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()));
|
||||
}
|
||||
else {
|
||||
converterList = Arrays.asList(converters);
|
||||
writerList = Arrays.asList(writers);
|
||||
}
|
||||
|
||||
GenericConversionService service = new GenericConversionService();
|
||||
@@ -195,7 +195,7 @@ public class MessageConverterResultHandlerTests {
|
||||
|
||||
RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build();
|
||||
|
||||
return new AbstractMessageConverterResultHandler(converterList, service, resolver) {};
|
||||
return new AbstractMessageWriterResultHandler(writerList, service, resolver) {};
|
||||
}
|
||||
|
||||
private void assertResponseBody(String responseBody) {
|
||||
@@ -44,8 +44,8 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
import org.springframework.format.support.DefaultFormattingConversionService;
|
||||
import org.springframework.format.support.FormattingConversionService;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.DecoderHttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.HttpMessageReader;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.ui.ExtendedModelMap;
|
||||
@@ -67,7 +67,7 @@ import static org.springframework.core.ResolvableType.forClassWithGenerics;
|
||||
/**
|
||||
* Unit tests for {@link RequestBodyArgumentResolver}. When adding a test also
|
||||
* consider whether the logic under test is in a parent class, then see:
|
||||
* {@link MessageConverterArgumentResolverTests}.
|
||||
* {@link MessageReaderArgumentResolverTests}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
@@ -90,14 +90,14 @@ public class RequestBodyArgumentResolverTests {
|
||||
}
|
||||
|
||||
private RequestBodyArgumentResolver resolver() {
|
||||
List<HttpMessageConverter<?>> converters = new ArrayList<>();
|
||||
converters.add(new CodecHttpMessageConverter<>(new StringDecoder()));
|
||||
List<HttpMessageReader<?>> readers = new ArrayList<>();
|
||||
readers.add(new DecoderHttpMessageReader<>(new StringDecoder()));
|
||||
|
||||
FormattingConversionService service = new DefaultFormattingConversionService();
|
||||
service.addConverter(new MonoToCompletableFutureConverter());
|
||||
service.addConverter(new ReactorToRxJava1Converter());
|
||||
|
||||
return new RequestBodyArgumentResolver(converters, service);
|
||||
return new RequestBodyArgumentResolver(readers, service);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -36,9 +36,9 @@ import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2Encoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageWriter;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
@@ -62,7 +62,7 @@ import static org.junit.Assert.assertEquals;
|
||||
* Unit tests for {@link ResponseBodyResultHandler}.When adding a test also
|
||||
* consider whether the logic under test is in a parent class, then see:
|
||||
* <ul>
|
||||
* <li>{@code MessageConverterResultHandlerTests},
|
||||
* <li>{@code MessageWriterResultHandlerTests},
|
||||
* <li>{@code ContentNegotiatingResultHandlerSupportTests}
|
||||
* </ul>
|
||||
*
|
||||
@@ -86,25 +86,25 @@ public class ResponseBodyResultHandlerTests {
|
||||
}
|
||||
|
||||
|
||||
private ResponseBodyResultHandler createHandler(HttpMessageConverter<?>... converters) {
|
||||
List<HttpMessageConverter<?>> converterList;
|
||||
if (ObjectUtils.isEmpty(converters)) {
|
||||
converterList = new ArrayList<>();
|
||||
converterList.add(new CodecHttpMessageConverter<>(new ByteBufferEncoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new StringEncoder()));
|
||||
converterList.add(new ResourceHttpMessageConverter());
|
||||
converterList.add(new CodecHttpMessageConverter<>(new Jaxb2Encoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new JacksonJsonEncoder()));
|
||||
private ResponseBodyResultHandler createHandler(HttpMessageWriter<?>... writers) {
|
||||
List<HttpMessageWriter<?>> writerList;
|
||||
if (ObjectUtils.isEmpty(writers)) {
|
||||
writerList = new ArrayList<>();
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new StringEncoder()));
|
||||
writerList.add(new ResourceHttpMessageWriter());
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2Encoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()));
|
||||
}
|
||||
else {
|
||||
converterList = Arrays.asList(converters);
|
||||
writerList = Arrays.asList(writers);
|
||||
}
|
||||
FormattingConversionService service = new DefaultFormattingConversionService();
|
||||
service.addConverter(new MonoToCompletableFutureConverter());
|
||||
service.addConverter(new ReactorToRxJava1Converter());
|
||||
RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build();
|
||||
|
||||
return new ResponseBodyResultHandler(converterList, new DefaultConversionService(), resolver);
|
||||
return new ResponseBodyResultHandler(writerList, new DefaultConversionService(), resolver);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -43,9 +43,9 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2Encoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.EncoderHttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageWriter;
|
||||
import org.springframework.http.converter.reactive.ResourceHttpMessageWriter;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.MockServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
@@ -68,7 +68,7 @@ import static org.springframework.core.ResolvableType.forClassWithGenerics;
|
||||
* Unit tests for {@link ResponseEntityResultHandler}. When adding a test also
|
||||
* consider whether the logic under test is in a parent class, then see:
|
||||
* <ul>
|
||||
* <li>{@code MessageConverterResultHandlerTests},
|
||||
* <li>{@code MessageWriterResultHandlerTests},
|
||||
* <li>{@code ContentNegotiatingResultHandlerSupportTests}
|
||||
* </ul>
|
||||
* @author Rossen Stoyanchev
|
||||
@@ -89,18 +89,18 @@ public class ResponseEntityResultHandlerTests {
|
||||
this.exchange = new DefaultServerWebExchange(request, this.response, new MockWebSessionManager());
|
||||
}
|
||||
|
||||
private ResponseEntityResultHandler createHandler(HttpMessageConverter<?>... converters) {
|
||||
List<HttpMessageConverter<?>> converterList;
|
||||
if (ObjectUtils.isEmpty(converters)) {
|
||||
converterList = new ArrayList<>();
|
||||
converterList.add(new CodecHttpMessageConverter<>(new ByteBufferEncoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new StringEncoder()));
|
||||
converterList.add(new ResourceHttpMessageConverter());
|
||||
converterList.add(new CodecHttpMessageConverter<>(new Jaxb2Encoder()));
|
||||
converterList.add(new CodecHttpMessageConverter<>(new JacksonJsonEncoder()));
|
||||
private ResponseEntityResultHandler createHandler(HttpMessageWriter<?>... writers) {
|
||||
List<HttpMessageWriter<?>> writerList;
|
||||
if (ObjectUtils.isEmpty(writers)) {
|
||||
writerList = new ArrayList<>();
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new StringEncoder()));
|
||||
writerList.add(new ResourceHttpMessageWriter());
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2Encoder()));
|
||||
writerList.add(new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()));
|
||||
}
|
||||
else {
|
||||
converterList = Arrays.asList(converters);
|
||||
writerList = Arrays.asList(writers);
|
||||
}
|
||||
FormattingConversionService service = new DefaultFormattingConversionService();
|
||||
service.addConverter(new MonoToCompletableFutureConverter());
|
||||
@@ -109,7 +109,7 @@ public class ResponseEntityResultHandlerTests {
|
||||
|
||||
RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build();
|
||||
|
||||
return new ResponseEntityResultHandler(converterList, service, resolver);
|
||||
return new ResponseEntityResultHandler(writerList, service, resolver);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,13 +16,8 @@
|
||||
|
||||
package org.springframework.web.reactive.result.method.annotation;
|
||||
|
||||
import static org.junit.Assume.assumeFalse;
|
||||
import static org.springframework.web.client.reactive.ClientWebRequestBuilders.*;
|
||||
import static org.springframework.web.client.reactive.ResponseExtractors.*;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -34,18 +29,13 @@ import reactor.test.TestSubscriber;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.codec.ByteBufferDecoder;
|
||||
import org.springframework.core.codec.ByteBufferEncoder;
|
||||
import org.springframework.core.codec.Encoder;
|
||||
import org.springframework.core.codec.StringDecoder;
|
||||
import org.springframework.core.codec.StringEncoder;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
|
||||
import org.springframework.http.codec.SseEventEncoder;
|
||||
import org.springframework.http.codec.SseEvent;
|
||||
import org.springframework.http.codec.json.JacksonJsonDecoder;
|
||||
import org.springframework.http.codec.json.JacksonJsonEncoder;
|
||||
import org.springframework.http.converter.reactive.CodecHttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.HttpMessageConverter;
|
||||
import org.springframework.http.converter.reactive.DecoderHttpMessageReader;
|
||||
import org.springframework.http.converter.reactive.HttpMessageReader;
|
||||
import org.springframework.http.server.reactive.AbstractHttpHandlerIntegrationTests;
|
||||
import org.springframework.http.server.reactive.HttpHandler;
|
||||
import org.springframework.http.server.reactive.bootstrap.JettyHttpServer;
|
||||
@@ -54,9 +44,12 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.client.reactive.WebClient;
|
||||
import org.springframework.web.reactive.DispatcherHandler;
|
||||
import org.springframework.web.reactive.config.WebReactiveConfiguration;
|
||||
import org.springframework.http.codec.SseEvent;
|
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||
|
||||
import static org.junit.Assume.assumeFalse;
|
||||
import static org.springframework.web.client.reactive.ClientWebRequestBuilders.get;
|
||||
import static org.springframework.web.client.reactive.ResponseExtractors.bodyStream;
|
||||
|
||||
/**
|
||||
* @author Sebastien Deleuze
|
||||
*/
|
||||
@@ -74,11 +67,6 @@ public class SseIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
||||
assumeFalse(server instanceof JettyHttpServer);
|
||||
|
||||
this.webClient = new WebClient(new ReactorClientHttpConnector());
|
||||
List<HttpMessageConverter<?>> converters = new ArrayList<>();
|
||||
converters.add(new CodecHttpMessageConverter<>(new ByteBufferEncoder(), new ByteBufferDecoder()));
|
||||
converters.add(new CodecHttpMessageConverter<>(new StringEncoder(), new StringDecoder(false)));
|
||||
converters.add(new CodecHttpMessageConverter<>(new JacksonJsonEncoder(), new JacksonJsonDecoder()));
|
||||
this.webClient.setMessageConverters(converters);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -110,16 +98,14 @@ public class SseIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sseAsPojo() throws Exception {
|
||||
public void sseAsPerson() throws Exception {
|
||||
Mono<String> result = this.webClient
|
||||
.perform(get("http://localhost:" + port + "/sse/person")
|
||||
.accept(new MediaType("text", "event-stream")))
|
||||
.extract(bodyStream(String.class))
|
||||
.filter(s -> !s.equals("\n"))
|
||||
.map(s -> (s.replace("\n", "")))
|
||||
.takeUntil(s -> {
|
||||
return s.endsWith("foo 1\"}");
|
||||
})
|
||||
.map(s -> s.replace("\n", ""))
|
||||
.takeUntil(s -> s.endsWith("foo 1\"}"))
|
||||
.reduce((s1, s2) -> s1 + s2);
|
||||
|
||||
TestSubscriber
|
||||
@@ -135,7 +121,7 @@ public class SseIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
||||
.accept(new MediaType("text", "event-stream")))
|
||||
.extract(bodyStream(String.class))
|
||||
.filter(s -> !s.equals("\n"))
|
||||
.map(s -> (s.replace("\n", "")))
|
||||
.map(s -> s.replace("\n", ""))
|
||||
.take(2);
|
||||
|
||||
TestSubscriber
|
||||
@@ -182,12 +168,6 @@ public class SseIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
||||
public SseController sseController() {
|
||||
return new SseController();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
|
||||
Encoder<Object> sseEncoder = new SseEventEncoder(Arrays.asList(new JacksonJsonEncoder()));
|
||||
converters.add(new CodecHttpMessageConverter<>(sseEncoder));
|
||||
}
|
||||
}
|
||||
|
||||
private static class Person {
|
||||
|
||||
@@ -58,12 +58,12 @@ import static org.junit.Assert.fail;
|
||||
|
||||
|
||||
/**
|
||||
* Unit tests for {@link HttpMessageConverterView}.
|
||||
* Unit tests for {@link HttpMessageWriterView}.
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class HttpMessageConverterViewTests {
|
||||
public class HttpMessageWriterViewTests {
|
||||
|
||||
private HttpMessageConverterView view = new HttpMessageConverterView(new JacksonJsonEncoder());
|
||||
private HttpMessageWriterView view = new HttpMessageWriterView(new JacksonJsonEncoder());
|
||||
|
||||
private HandlerResult result;
|
||||
|
||||
@@ -123,7 +123,7 @@ public class HttpMessageConverterViewTests {
|
||||
|
||||
@Test
|
||||
public void extractObjectMultipleMatchesNotSupported() throws Exception {
|
||||
HttpMessageConverterView view = new HttpMessageConverterView(new StringEncoder());
|
||||
HttpMessageWriterView view = new HttpMessageWriterView(new StringEncoder());
|
||||
view.setModelKeys(new HashSet<>(Arrays.asList("foo1", "foo2")));
|
||||
this.model.addAttribute("foo1", "bar1");
|
||||
this.model.addAttribute("foo2", "bar2");
|
||||
@@ -140,7 +140,7 @@ public class HttpMessageConverterViewTests {
|
||||
|
||||
@Test
|
||||
public void extractObjectNotSupported() throws Exception {
|
||||
HttpMessageConverterView view = new HttpMessageConverterView(new Jaxb2Encoder());
|
||||
HttpMessageWriterView view = new HttpMessageWriterView(new Jaxb2Encoder());
|
||||
view.setModelKeys(new HashSet<>(Collections.singletonList("foo1")));
|
||||
this.model.addAttribute("foo1", "bar1");
|
||||
|
||||
Reference in New Issue
Block a user