Skip to content

Commit 31d1e26

Browse files
committed
Use List<T> instead of Supplier<Stream<T>>
This commit changes all methods that return `Supplier<Stream<T>` to return `List<T>` instead. This includes the HandlerStrategies, but also BodyInserter.Context, BodyExtractor.Context, and ServerResponse.Context. The reason for this change is that most of the strategies have some sort of order, where more specific message readers - for instance - come before generic ones. Such an ordering can only be enforced through a List. Issue: SPR-15578
1 parent 01e3561 commit 31d1e26

28 files changed

+150
-188
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractor.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616

1717
package org.springframework.web.reactive.function;
1818

19+
import java.util.List;
1920
import java.util.Map;
2021
import java.util.Optional;
21-
import java.util.function.Supplier;
22-
import java.util.stream.Stream;
2322

2423
import org.springframework.http.ReactiveHttpInputMessage;
2524
import org.springframework.http.codec.HttpMessageReader;
@@ -52,11 +51,10 @@ public interface BodyExtractor<T, M extends ReactiveHttpInputMessage> {
5251
interface Context {
5352

5453
/**
55-
* Supply a {@linkplain Stream stream} of {@link HttpMessageReader}s
56-
* to be used for body extraction.
54+
* Return the {@link HttpMessageReader}s to be used for body extraction.
5755
* @return the stream of message readers
5856
*/
59-
Supplier<Stream<HttpMessageReader<?>>> messageReaders();
57+
List<HttpMessageReader<?>> messageReaders();
6058

6159
/**
6260
* Optionally return the {@link ServerHttpResponse}, if present.

spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import java.util.List;
2020
import java.util.Optional;
2121
import java.util.function.Function;
22-
import java.util.function.Supplier;
2322
import java.util.stream.Collectors;
24-
import java.util.stream.Stream;
2523

2624
import org.reactivestreams.Publisher;
2725
import reactor.core.publisher.Flux;
@@ -197,14 +195,14 @@ private static <T, S extends Publisher<T>> S readWithMessageReaders(
197195
Function<HttpMessageReader<T>, S> readerFunction, Function<Throwable, S> unsupportedError) {
198196

199197
MediaType contentType = contentType(inputMessage);
200-
Supplier<Stream<HttpMessageReader<?>>> messageReaders = context.messageReaders();
201-
return messageReaders.get()
198+
List<HttpMessageReader<?>> messageReaders = context.messageReaders();
199+
return messageReaders.stream()
202200
.filter(r -> r.canRead(elementType, contentType))
203201
.findFirst()
204202
.map(BodyExtractors::<T>cast)
205203
.map(readerFunction)
206204
.orElseGet(() -> {
207-
List<MediaType> supportedMediaTypes = messageReaders.get()
205+
List<MediaType> supportedMediaTypes = messageReaders.stream()
208206
.flatMap(reader -> reader.getReadableMediaTypes().stream())
209207
.collect(Collectors.toList());
210208
UnsupportedMediaTypeException error =
@@ -215,7 +213,7 @@ private static <T, S extends Publisher<T>> S readWithMessageReaders(
215213

216214
private static <T> HttpMessageReader<T> messageReader(ResolvableType elementType,
217215
MediaType mediaType, BodyExtractor.Context context) {
218-
return context.messageReaders().get()
216+
return context.messageReaders().stream()
219217
.filter(messageReader -> messageReader.canRead(elementType, mediaType))
220218
.findFirst()
221219
.map(BodyExtractors::<T>cast)

spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserter.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616

1717
package org.springframework.web.reactive.function;
1818

19+
import java.util.List;
1920
import java.util.Map;
2021
import java.util.Optional;
21-
import java.util.function.Supplier;
22-
import java.util.stream.Stream;
2322

2423
import reactor.core.publisher.Mono;
2524

@@ -54,11 +53,10 @@ public interface BodyInserter<T, M extends ReactiveHttpOutputMessage> {
5453
interface Context {
5554

5655
/**
57-
* Supply a {@linkplain Stream stream} of {@link HttpMessageWriter}s
58-
* to be used for response body conversion.
56+
* Return the {@link HttpMessageWriter}s to be used for response body conversion.
5957
* @return the stream of message writers
6058
*/
61-
Supplier<Stream<HttpMessageWriter<?>>> messageWriters();
59+
List<HttpMessageWriter<?>> messageWriters();
6260

6361
/**
6462
* Optionally return the {@link ServerHttpRequest}, if present.

spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java

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

1919
import java.util.List;
2020
import java.util.Optional;
21-
import java.util.function.Supplier;
2221
import java.util.stream.Collectors;
23-
import java.util.stream.Stream;
2422

2523
import org.reactivestreams.Publisher;
2624
import reactor.core.publisher.Mono;
@@ -141,7 +139,7 @@ public static <T extends Resource> BodyInserter<T, ReactiveHttpOutputMessage> fr
141139
}
142140

143141
private static HttpMessageWriter<Resource> resourceHttpMessageWriter(BodyInserter.Context context) {
144-
return context.messageWriters().get()
142+
return context.messageWriters().stream()
145143
.filter(messageWriter -> messageWriter.canWrite(RESOURCE_TYPE, null))
146144
.findFirst()
147145
.map(BodyInserters::<Resource>cast)
@@ -288,8 +286,8 @@ private static <T, P extends Publisher<?>, M extends ReactiveHttpOutputMessage>
288286

289287
return (outputMessage, context) -> {
290288
MediaType contentType = outputMessage.getHeaders().getContentType();
291-
Supplier<Stream<HttpMessageWriter<?>>> messageWriters = context.messageWriters();
292-
return messageWriters.get()
289+
List<HttpMessageWriter<?>> messageWriters = context.messageWriters();
290+
return messageWriters.stream()
293291
.filter(messageWriter -> messageWriter.canWrite(bodyType, contentType))
294292
.findFirst()
295293
.map(BodyInserters::cast)
@@ -305,7 +303,7 @@ private static <T, P extends Publisher<?>, M extends ReactiveHttpOutputMessage>
305303
}
306304
})
307305
.orElseGet(() -> {
308-
List<MediaType> supportedMediaTypes = messageWriters.get()
306+
List<MediaType> supportedMediaTypes = messageWriters.stream()
309307
.flatMap(reader -> reader.getWritableMediaTypes().stream())
310308
.collect(Collectors.toList());
311309
UnsupportedMediaTypeException error =
@@ -318,7 +316,7 @@ private static <T, P extends Publisher<?>, M extends ReactiveHttpOutputMessage>
318316
private static <T> HttpMessageWriter<T> findMessageWriter(
319317
BodyInserter.Context context, ResolvableType type, MediaType mediaType) {
320318

321-
return context.messageWriters().get()
319+
return context.messageWriters().stream()
322320
.filter(messageWriter -> messageWriter.canWrite(type, mediaType))
323321
.findFirst()
324322
.map(BodyInserters::<T>cast)

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientRequestBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818

1919
import java.net.URI;
2020
import java.util.Collections;
21+
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Optional;
23-
import java.util.function.Supplier;
24-
import java.util.stream.Stream;
2524

2625
import org.reactivestreams.Publisher;
2726
import reactor.core.publisher.Mono;
@@ -187,7 +186,7 @@ public Mono<Void> writeTo(ClientHttpRequest request, ExchangeStrategies strategi
187186

188187
return this.inserter.insert(request, new BodyInserter.Context() {
189188
@Override
190-
public Supplier<Stream<HttpMessageWriter<?>>> messageWriters() {
189+
public List<HttpMessageWriter<?>> messageWriters() {
191190
return strategies.messageWriters();
192191
}
193192

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponse.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import java.util.Map;
2222
import java.util.Optional;
2323
import java.util.OptionalLong;
24-
import java.util.function.Supplier;
25-
import java.util.stream.Stream;
2624

2725
import reactor.core.publisher.Flux;
2826
import reactor.core.publisher.Mono;
@@ -79,7 +77,7 @@ public MultiValueMap<String, ResponseCookie> cookies() {
7977
public <T> T body(BodyExtractor<T, ? super ClientHttpResponse> extractor) {
8078
return extractor.extract(this.response, new BodyExtractor.Context() {
8179
@Override
82-
public Supplier<Stream<HttpMessageReader<?>>> messageReaders() {
80+
public List<HttpMessageReader<?>> messageReaders() {
8381
return strategies.messageReaders();
8482
}
8583

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultExchangeStrategiesBuilder.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import java.util.Collections;
2121
import java.util.List;
2222
import java.util.function.Consumer;
23-
import java.util.function.Supplier;
24-
import java.util.stream.Stream;
2523

2624
import org.springframework.http.codec.ClientCodecConfigurer;
2725
import org.springframework.http.codec.HttpMessageReader;
@@ -88,13 +86,13 @@ private static <T> List<T> unmodifiableCopy(List<? extends T> list) {
8886
}
8987

9088
@Override
91-
public Supplier<Stream<HttpMessageReader<?>>> messageReaders() {
92-
return this.messageReaders::stream;
89+
public List<HttpMessageReader<?>> messageReaders() {
90+
return this.messageReaders;
9391
}
9492

9593
@Override
96-
public Supplier<Stream<HttpMessageWriter<?>>> messageWriters() {
97-
return this.messageWriters::stream;
94+
public List<HttpMessageWriter<?>> messageWriters() {
95+
return this.messageWriters;
9896
}
9997
}
10098

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ExchangeStrategies.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616

1717
package org.springframework.web.reactive.function.client;
1818

19+
import java.util.List;
1920
import java.util.function.Consumer;
20-
import java.util.function.Supplier;
21-
import java.util.stream.Stream;
2221

2322
import org.springframework.http.codec.ClientCodecConfigurer;
2423
import org.springframework.http.codec.HttpMessageReader;
@@ -28,8 +27,7 @@
2827
* Defines the strategies for invoking {@link ExchangeFunction}s. An instance of
2928
* this class is immutable; instances are typically created through the mutable {@link Builder}:
3029
* either through {@link #builder()} to set up default strategies, or {@link #empty()} to start
31-
* from scratch. Alternatively, {@code ExchangeStrategies} instances can be created through
32-
* {@link #of(Supplier, Supplier)}.
30+
* from scratch.
3331
*
3432
* @author Brian Clozel
3533
* @author Arjen Poutsma
@@ -40,18 +38,16 @@ public interface ExchangeStrategies {
4038
// Instance methods
4139

4240
/**
43-
* Supply a {@linkplain Stream stream} of {@link HttpMessageReader}s to be used for request
44-
* body conversion.
41+
* Return the {@link HttpMessageReader}s to be used for request body conversion.
4542
* @return the stream of message readers
4643
*/
47-
Supplier<Stream<HttpMessageReader<?>>> messageReaders();
44+
List<HttpMessageReader<?>> messageReaders();
4845

4946
/**
50-
* Supply a {@linkplain Stream stream} of {@link HttpMessageWriter}s to be used for response
51-
* body conversion.
47+
* Return the {@link HttpMessageWriter}s to be used for response body conversion.
5248
* @return the stream of message writers
5349
*/
54-
Supplier<Stream<HttpMessageWriter<?>>> messageWriters();
50+
List<HttpMessageWriter<?>> messageWriters();
5551

5652

5753
// Static methods

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultEntityResponseBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import java.util.Arrays;
2424
import java.util.HashMap;
2525
import java.util.LinkedHashSet;
26+
import java.util.List;
2627
import java.util.Map;
2728
import java.util.Optional;
2829
import java.util.Set;
29-
import java.util.function.Supplier;
30-
import java.util.stream.Stream;
3130

3231
import reactor.core.publisher.Mono;
3332

@@ -208,7 +207,7 @@ public Mono<Void> writeTo(ServerWebExchange exchange, Context context) {
208207
writeStatusAndHeaders(response);
209208
return inserter().insert(response, new BodyInserter.Context() {
210209
@Override
211-
public Supplier<Stream<HttpMessageWriter<?>>> messageWriters() {
210+
public List<HttpMessageWriter<?>> messageWriters() {
212211
return context.messageWriters();
213212
}
214213

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultHandlerStrategiesBuilder.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import java.util.Collections;
2121
import java.util.List;
2222
import java.util.function.Consumer;
23-
import java.util.function.Supplier;
24-
import java.util.stream.Stream;
2523

2624
import org.springframework.http.codec.CodecConfigurer;
2725
import org.springframework.http.codec.HttpMessageReader;
@@ -135,28 +133,28 @@ private static <T> List<T> unmodifiableCopy(List<? extends T> list) {
135133
}
136134

137135
@Override
138-
public Supplier<Stream<HttpMessageReader<?>>> messageReaders() {
139-
return this.messageReaders::stream;
136+
public List<HttpMessageReader<?>> messageReaders() {
137+
return this.messageReaders;
140138
}
141139

142140
@Override
143-
public Supplier<Stream<HttpMessageWriter<?>>> messageWriters() {
144-
return this.messageWriters::stream;
141+
public List<HttpMessageWriter<?>> messageWriters() {
142+
return this.messageWriters;
145143
}
146144

147145
@Override
148-
public Supplier<Stream<ViewResolver>> viewResolvers() {
149-
return this.viewResolvers::stream;
146+
public List<ViewResolver> viewResolvers() {
147+
return this.viewResolvers;
150148
}
151149

152150
@Override
153-
public Supplier<Stream<WebFilter>> webFilters() {
154-
return this.webFilters::stream;
151+
public List<WebFilter> webFilters() {
152+
return this.webFilters;
155153
}
156154

157155
@Override
158-
public Supplier<Stream<WebExceptionHandler>> exceptionHandlers() {
159-
return this.exceptionHandlers::stream;
156+
public List<WebExceptionHandler> exceptionHandlers() {
157+
return this.exceptionHandlers;
160158
}
161159
}
162160

0 commit comments

Comments
 (0)