Browse Source

Refactor BodyInsertor

Refactor BodyInsertor to expose insertion logic directly, rather than
exposing a writer function and supplier.
pull/1179/head
Arjen Poutsma 10 years ago
parent
commit
b6035ce9ae
  1. 16
      spring-web-reactive/src/main/java/org/springframework/web/reactive/function/BodyInsertor.java
  2. 9
      spring-web-reactive/src/main/java/org/springframework/web/reactive/function/BodyInsertors.java
  3. 4
      spring-web-reactive/src/main/java/org/springframework/web/reactive/function/DefaultResponseBuilder.java
  4. 27
      spring-web-reactive/src/test/java/org/springframework/web/reactive/function/BodyInsertorsTests.java

16
spring-web-reactive/src/main/java/org/springframework/web/reactive/function/BodyInsertor.java

@ -25,8 +25,9 @@ import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* A combination of functions that can insert data into a {@link Response} body. * A component that can insert data into a {@link Response} body.
* *
* @param <T> the type of data to insert
* @author Arjen Poutsma * @author Arjen Poutsma
* @since 5.0 * @since 5.0
* @see Response#body() * @see Response#body()
@ -36,14 +37,19 @@ import org.springframework.util.Assert;
public interface BodyInsertor<T> { public interface BodyInsertor<T> {
/** /**
* Return a function that writes to the given response body. * Insert into the given response.
* @param response the response to insert into
* @param configuration the configuration to use
* @return a {@code Mono} that indicates completion or error
*/ */
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer(); Mono<Void> insert(ServerHttpResponse response, Configuration configuration);
/** /**
* Return a function that supplies the type contained in the body. * Return the type contained in the body.
* @return the type contained in the body
*/ */
Supplier<T> supplier(); T t();
/** /**
* Return a new {@code BodyInsertor} described by the given writer and supplier functions. * Return a new {@code BodyInsertor} described by the given writer and supplier functions.

9
spring-web-reactive/src/main/java/org/springframework/web/reactive/function/BodyInsertors.java

@ -240,14 +240,15 @@ public abstract class BodyInsertors {
} }
@Override @Override
public BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer() { public Mono<Void> insert(ServerHttpResponse response, Configuration configuration) {
return this.writer; return this.writer.apply(response, configuration);
} }
@Override @Override
public Supplier<T> supplier() { public T t() {
return this.supplier; return this.supplier.get();
} }
} }

4
spring-web-reactive/src/main/java/org/springframework/web/reactive/function/DefaultResponseBuilder.java

@ -246,14 +246,14 @@ class DefaultResponseBuilder implements Response.BodyBuilder {
@Override @Override
public T body() { public T body() {
return this.insertor.supplier().get(); return this.insertor.t();
} }
@Override @Override
public Mono<Void> writeTo(ServerWebExchange exchange, Configuration configuration) { public Mono<Void> writeTo(ServerWebExchange exchange, Configuration configuration) {
ServerHttpResponse response = exchange.getResponse(); ServerHttpResponse response = exchange.getResponse();
writeStatusAndHeaders(response); writeStatusAndHeaders(response);
return this.insertor.writer().apply(response, configuration); return this.insertor.insert(response, configuration);
} }
} }

27
spring-web-reactive/src/test/java/org/springframework/web/reactive/function/BodyInsertorsTests.java

@ -18,7 +18,6 @@ package org.springframework.web.reactive.function;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.function.BiFunction;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
@ -29,7 +28,6 @@ import org.springframework.core.io.Resource;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.codec.ServerSentEvent; import org.springframework.http.codec.ServerSentEvent;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse; import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber; import org.springframework.tests.TestSubscriber;
@ -47,11 +45,10 @@ public class BodyInsertorsTests {
String body = "foo"; String body = "foo";
BodyInsertor<String> insertor = BodyInsertors.fromObject(body); BodyInsertor<String> insertor = BodyInsertors.fromObject(body);
assertEquals(body, insertor.supplier().get()); assertEquals(body, insertor.t());
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer = insertor.writer();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = writer.apply(response, Configuration.builder().build()); Mono<Void> result = insertor.insert(response, Configuration.builder().build());
TestSubscriber.subscribe(result) TestSubscriber.subscribe(result)
.assertComplete(); .assertComplete();
@ -67,11 +64,10 @@ public class BodyInsertorsTests {
Flux<String> body = Flux.just("foo"); Flux<String> body = Flux.just("foo");
BodyInsertor<Flux<String>> insertor = BodyInsertors.fromPublisher(body, String.class); BodyInsertor<Flux<String>> insertor = BodyInsertors.fromPublisher(body, String.class);
assertEquals(body, insertor.supplier().get()); assertEquals(body, insertor.t());
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer = insertor.writer();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = writer.apply(response, Configuration.builder().build()); Mono<Void> result = insertor.insert(response, Configuration.builder().build());
TestSubscriber.subscribe(result) TestSubscriber.subscribe(result)
.assertComplete(); .assertComplete();
@ -87,11 +83,10 @@ public class BodyInsertorsTests {
Resource body = new ClassPathResource("response.txt", getClass()); Resource body = new ClassPathResource("response.txt", getClass());
BodyInsertor<Resource> insertor = BodyInsertors.fromResource(body); BodyInsertor<Resource> insertor = BodyInsertors.fromResource(body);
assertEquals(body, insertor.supplier().get()); assertEquals(body, insertor.t());
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer = insertor.writer();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = writer.apply(response, Configuration.builder().build()); Mono<Void> result = insertor.insert(response, Configuration.builder().build());
TestSubscriber.subscribe(result) TestSubscriber.subscribe(result)
.assertComplete(); .assertComplete();
@ -113,11 +108,10 @@ public class BodyInsertorsTests {
BodyInsertor<Flux<ServerSentEvent<String>>> insertor = BodyInsertor<Flux<ServerSentEvent<String>>> insertor =
BodyInsertors.fromServerSentEvents(body); BodyInsertors.fromServerSentEvents(body);
assertEquals(body, insertor.supplier().get()); assertEquals(body, insertor.t());
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer = insertor.writer();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = writer.apply(response, Configuration.builder().build()); Mono<Void> result = insertor.insert(response, Configuration.builder().build());
TestSubscriber.subscribe(result) TestSubscriber.subscribe(result)
.assertComplete(); .assertComplete();
@ -129,11 +123,10 @@ public class BodyInsertorsTests {
BodyInsertor<Flux<String>> insertor = BodyInsertor<Flux<String>> insertor =
BodyInsertors.fromServerSentEvents(body, String.class); BodyInsertors.fromServerSentEvents(body, String.class);
assertEquals(body, insertor.supplier().get()); assertEquals(body, insertor.t());
BiFunction<ServerHttpResponse, Configuration, Mono<Void>> writer = insertor.writer();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = writer.apply(response, Configuration.builder().build()); Mono<Void> result = insertor.insert(response, Configuration.builder().build());
TestSubscriber.subscribe(result) TestSubscriber.subscribe(result)
.assertComplete(); .assertComplete();

Loading…
Cancel
Save