Skip to content

Commit 7555d0e

Browse files
committed
Update generics on WebFlux RouterFunctions.Builder
Consistently allow subtypes of ServerResponse to be returned for any provided HandlerFunction and HandlerFilterFunction. Both allow use of subtypes such as EntityServerResponse and RenderingResponse, and in the end we support any ServerResponse. Closes gh-35791
1 parent 622251d commit 7555d0e

File tree

2 files changed

+95
-90
lines changed

2 files changed

+95
-90
lines changed

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

Lines changed: 59 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -51,191 +51,191 @@ class RouterFunctionBuilder implements RouterFunctions.Builder {
5151
private final List<HandlerFilterFunction<ServerResponse, ServerResponse>> errorHandlers = new ArrayList<>();
5252

5353

54+
@SuppressWarnings("unchecked")
5455
@Override
55-
public RouterFunctions.Builder add(RouterFunction<ServerResponse> routerFunction) {
56+
public <T extends ServerResponse> RouterFunctions.Builder add(RouterFunction<T> routerFunction) {
5657
Assert.notNull(routerFunction, "RouterFunction must not be null");
57-
this.routerFunctions.add(routerFunction);
58+
this.routerFunctions.add((RouterFunction<ServerResponse>) routerFunction);
5859
return this;
5960
}
6061

61-
private RouterFunctions.Builder add(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
62-
this.routerFunctions.add(RouterFunctions.route(predicate, handlerFunction));
63-
return this;
62+
private <T extends ServerResponse> RouterFunctions.Builder add(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
63+
return add(RouterFunctions.route(predicate, handlerFunction));
6464
}
6565

6666
// GET
6767

6868
@Override
69-
public RouterFunctions.Builder GET(HandlerFunction<ServerResponse> handlerFunction) {
69+
public <T extends ServerResponse> RouterFunctions.Builder GET(HandlerFunction<T> handlerFunction) {
7070
return add(RequestPredicates.method(HttpMethod.GET), handlerFunction);
7171
}
7272

7373
@Override
74-
public RouterFunctions.Builder GET(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
74+
public <T extends ServerResponse> RouterFunctions.Builder GET(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
7575
return add(RequestPredicates.method(HttpMethod.GET).and(predicate), handlerFunction);
7676
}
7777

7878
@Override
79-
public RouterFunctions.Builder GET(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
79+
public <T extends ServerResponse> RouterFunctions.Builder GET(String pattern, HandlerFunction<T> handlerFunction) {
8080
return add(RequestPredicates.GET(pattern), handlerFunction);
8181
}
8282

8383
@Override
84-
public RouterFunctions.Builder GET(String pattern, RequestPredicate predicate,
85-
HandlerFunction<ServerResponse> handlerFunction) {
84+
public <T extends ServerResponse> RouterFunctions.Builder GET(String pattern, RequestPredicate predicate,
85+
HandlerFunction<T> handlerFunction) {
8686

8787
return add(RequestPredicates.GET(pattern).and(predicate), handlerFunction);
8888
}
8989

9090
// HEAD
9191

9292
@Override
93-
public RouterFunctions.Builder HEAD(HandlerFunction<ServerResponse> handlerFunction) {
93+
public <T extends ServerResponse> RouterFunctions.Builder HEAD(HandlerFunction<T> handlerFunction) {
9494
return add(RequestPredicates.method(HttpMethod.HEAD), handlerFunction);
9595
}
9696

9797
@Override
98-
public RouterFunctions.Builder HEAD(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
98+
public <T extends ServerResponse> RouterFunctions.Builder HEAD(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
9999
return add(RequestPredicates.method(HttpMethod.HEAD).and(predicate), handlerFunction);
100100
}
101101

102102
@Override
103-
public RouterFunctions.Builder HEAD(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
103+
public <T extends ServerResponse> RouterFunctions.Builder HEAD(String pattern, HandlerFunction<T> handlerFunction) {
104104
return add(RequestPredicates.HEAD(pattern), handlerFunction);
105105
}
106106

107107
@Override
108-
public RouterFunctions.Builder HEAD(String pattern, RequestPredicate predicate,
109-
HandlerFunction<ServerResponse> handlerFunction) {
108+
public <T extends ServerResponse> RouterFunctions.Builder HEAD(String pattern, RequestPredicate predicate,
109+
HandlerFunction<T> handlerFunction) {
110110

111111
return add(RequestPredicates.HEAD(pattern).and(predicate), handlerFunction);
112112
}
113113

114114
// POST
115115

116116
@Override
117-
public RouterFunctions.Builder POST(HandlerFunction<ServerResponse> handlerFunction) {
117+
public <T extends ServerResponse> RouterFunctions.Builder POST(HandlerFunction<T> handlerFunction) {
118118
return add(RequestPredicates.method(HttpMethod.POST), handlerFunction);
119119
}
120120

121121
@Override
122-
public RouterFunctions.Builder POST(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
122+
public <T extends ServerResponse> RouterFunctions.Builder POST(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
123123
return add(RequestPredicates.method(HttpMethod.POST).and(predicate), handlerFunction);
124124
}
125125

126126
@Override
127-
public RouterFunctions.Builder POST(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
127+
public <T extends ServerResponse> RouterFunctions.Builder POST(String pattern, HandlerFunction<T> handlerFunction) {
128128
return add(RequestPredicates.POST(pattern), handlerFunction);
129129
}
130130

131131
@Override
132-
public RouterFunctions.Builder POST(String pattern, RequestPredicate predicate,
133-
HandlerFunction<ServerResponse> handlerFunction) {
132+
public <T extends ServerResponse> RouterFunctions.Builder POST(String pattern, RequestPredicate predicate,
133+
HandlerFunction<T> handlerFunction) {
134134

135135
return add(RequestPredicates.POST(pattern).and(predicate), handlerFunction);
136136
}
137137

138138
// PUT
139139

140140
@Override
141-
public RouterFunctions.Builder PUT(HandlerFunction<ServerResponse> handlerFunction) {
141+
public <T extends ServerResponse> RouterFunctions.Builder PUT(HandlerFunction<T> handlerFunction) {
142142
return add(RequestPredicates.method(HttpMethod.PUT), handlerFunction);
143143
}
144144

145145
@Override
146-
public RouterFunctions.Builder PUT(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
146+
public <T extends ServerResponse> RouterFunctions.Builder PUT(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
147147
return add(RequestPredicates.method(HttpMethod.PUT).and(predicate), handlerFunction);
148148
}
149149

150150
@Override
151-
public RouterFunctions.Builder PUT(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
151+
public <T extends ServerResponse> RouterFunctions.Builder PUT(String pattern, HandlerFunction<T> handlerFunction) {
152152
return add(RequestPredicates.PUT(pattern), handlerFunction);
153153
}
154154

155155
@Override
156-
public RouterFunctions.Builder PUT(String pattern, RequestPredicate predicate,
157-
HandlerFunction<ServerResponse> handlerFunction) {
156+
public <T extends ServerResponse> RouterFunctions.Builder PUT(String pattern, RequestPredicate predicate,
157+
HandlerFunction<T> handlerFunction) {
158158

159159
return add(RequestPredicates.PUT(pattern).and(predicate), handlerFunction);
160160
}
161161

162162
// PATCH
163163

164164
@Override
165-
public RouterFunctions.Builder PATCH(HandlerFunction<ServerResponse> handlerFunction) {
165+
public <T extends ServerResponse> RouterFunctions.Builder PATCH(HandlerFunction<T> handlerFunction) {
166166
return add(RequestPredicates.method(HttpMethod.PATCH), handlerFunction);
167167
}
168168

169169
@Override
170-
public RouterFunctions.Builder PATCH(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
170+
public <T extends ServerResponse> RouterFunctions.Builder PATCH(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
171171
return add(RequestPredicates.method(HttpMethod.PATCH).and(predicate), handlerFunction);
172172
}
173173

174174
@Override
175-
public RouterFunctions.Builder PATCH(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
175+
public <T extends ServerResponse> RouterFunctions.Builder PATCH(String pattern, HandlerFunction<T> handlerFunction) {
176176
return add(RequestPredicates.PATCH(pattern), handlerFunction);
177177
}
178178

179179
@Override
180-
public RouterFunctions.Builder PATCH(String pattern, RequestPredicate predicate,
181-
HandlerFunction<ServerResponse> handlerFunction) {
180+
public <T extends ServerResponse> RouterFunctions.Builder PATCH(String pattern, RequestPredicate predicate,
181+
HandlerFunction<T> handlerFunction) {
182182

183183
return add(RequestPredicates.PATCH(pattern).and(predicate), handlerFunction);
184184
}
185185

186186
// DELETE
187187

188188
@Override
189-
public RouterFunctions.Builder DELETE(HandlerFunction<ServerResponse> handlerFunction) {
189+
public <T extends ServerResponse> RouterFunctions.Builder DELETE(HandlerFunction<T> handlerFunction) {
190190
return add(RequestPredicates.method(HttpMethod.DELETE), handlerFunction);
191191
}
192192

193193
@Override
194-
public RouterFunctions.Builder DELETE(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
194+
public <T extends ServerResponse> RouterFunctions.Builder DELETE(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
195195
return add(RequestPredicates.method(HttpMethod.DELETE).and(predicate), handlerFunction);
196196
}
197197

198198
@Override
199-
public RouterFunctions.Builder DELETE(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
199+
public <T extends ServerResponse> RouterFunctions.Builder DELETE(String pattern, HandlerFunction<T> handlerFunction) {
200200
return add(RequestPredicates.DELETE(pattern), handlerFunction);
201201
}
202202

203203
@Override
204-
public RouterFunctions.Builder DELETE(String pattern, RequestPredicate predicate,
205-
HandlerFunction<ServerResponse> handlerFunction) {
204+
public <T extends ServerResponse> RouterFunctions.Builder DELETE(String pattern, RequestPredicate predicate,
205+
HandlerFunction<T> handlerFunction) {
206206

207207
return add(RequestPredicates.DELETE(pattern).and(predicate), handlerFunction);
208208
}
209209

210210
// OPTIONS
211211

212212
@Override
213-
public RouterFunctions.Builder OPTIONS(HandlerFunction<ServerResponse> handlerFunction) {
213+
public <T extends ServerResponse> RouterFunctions.Builder OPTIONS(HandlerFunction<T> handlerFunction) {
214214
return add(RequestPredicates.method(HttpMethod.OPTIONS), handlerFunction);
215215
}
216216

217217
@Override
218-
public RouterFunctions.Builder OPTIONS(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
218+
public <T extends ServerResponse> RouterFunctions.Builder OPTIONS(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
219219
return add(RequestPredicates.method(HttpMethod.OPTIONS).and(predicate), handlerFunction);
220220
}
221221

222222
@Override
223-
public RouterFunctions.Builder OPTIONS(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
223+
public <T extends ServerResponse> RouterFunctions.Builder OPTIONS(String pattern, HandlerFunction<T> handlerFunction) {
224224
return add(RequestPredicates.OPTIONS(pattern), handlerFunction);
225225
}
226226

227227
@Override
228-
public RouterFunctions.Builder OPTIONS(String pattern, RequestPredicate predicate,
229-
HandlerFunction<ServerResponse> handlerFunction) {
228+
public <T extends ServerResponse> RouterFunctions.Builder OPTIONS(String pattern, RequestPredicate predicate,
229+
HandlerFunction<T> handlerFunction) {
230230

231231
return add(RequestPredicates.OPTIONS(pattern).and(predicate), handlerFunction);
232232
}
233233

234234
// other
235235

236236
@Override
237-
public RouterFunctions.Builder route(RequestPredicate predicate,
238-
HandlerFunction<ServerResponse> handlerFunction) {
237+
public <T extends ServerResponse> RouterFunctions.Builder route(RequestPredicate predicate,
238+
HandlerFunction<T> handlerFunction) {
239239
return add(RouterFunctions.route(predicate, handlerFunction));
240240
}
241241

@@ -287,13 +287,14 @@ public RouterFunctions.Builder nest(RequestPredicate predicate,
287287
return this;
288288
}
289289

290+
@SuppressWarnings("unchecked")
290291
@Override
291-
public RouterFunctions.Builder nest(RequestPredicate predicate,
292-
Supplier<RouterFunction<ServerResponse>> routerFunctionSupplier) {
292+
public <T extends ServerResponse> RouterFunctions.Builder nest(RequestPredicate predicate,
293+
Supplier<RouterFunction<T>> routerFunctionSupplier) {
293294

294295
Assert.notNull(routerFunctionSupplier, "RouterFunction Supplier must not be null");
295296

296-
RouterFunction<ServerResponse> nestedRoute = routerFunctionSupplier.get();
297+
RouterFunction<ServerResponse> nestedRoute = (RouterFunction<ServerResponse>) routerFunctionSupplier.get();
297298
this.routerFunctions.add(RouterFunctions.nest(predicate, nestedRoute));
298299
return this;
299300
}
@@ -306,17 +307,20 @@ public RouterFunctions.Builder path(String pattern,
306307
}
307308

308309
@Override
309-
public RouterFunctions.Builder path(String pattern,
310-
Supplier<RouterFunction<ServerResponse>> routerFunctionSupplier) {
310+
public <T extends ServerResponse> RouterFunctions.Builder path(String pattern,
311+
Supplier<RouterFunction<T>> routerFunctionSupplier) {
311312

312313
return nest(RequestPredicates.path(pattern), routerFunctionSupplier);
313314
}
314315

316+
@SuppressWarnings("unchecked")
315317
@Override
316-
public RouterFunctions.Builder filter(HandlerFilterFunction<ServerResponse, ServerResponse> filterFunction) {
318+
public <T extends ServerResponse, R extends ServerResponse> RouterFunctions.Builder filter(
319+
HandlerFilterFunction<T, R> filterFunction) {
320+
317321
Assert.notNull(filterFunction, "HandlerFilterFunction must not be null");
318322

319-
this.filterFunctions.add(filterFunction);
323+
this.filterFunctions.add((HandlerFilterFunction<ServerResponse, ServerResponse>) filterFunction);
320324
return this;
321325
}
322326

@@ -326,18 +330,19 @@ public RouterFunctions.Builder before(Function<ServerRequest, ServerRequest> req
326330
return filter((request, next) -> next.handle(requestProcessor.apply(request)));
327331
}
328332

333+
@SuppressWarnings("unchecked")
329334
@Override
330-
public RouterFunctions.Builder after(
331-
BiFunction<ServerRequest, ServerResponse, ServerResponse> responseProcessor) {
335+
public <T extends ServerResponse, R extends ServerResponse> RouterFunctions.Builder after(
336+
BiFunction<ServerRequest, T, R> responseProcessor) {
332337

333338
Assert.notNull(responseProcessor, "ResponseProcessor must not be null");
334339
return filter((request, next) -> next.handle(request)
335-
.map(serverResponse -> responseProcessor.apply(request, serverResponse)));
340+
.map(serverResponse -> responseProcessor.apply(request, (T) serverResponse)));
336341
}
337342

338343
@Override
339-
public RouterFunctions.Builder onError(Predicate<? super Throwable> predicate,
340-
BiFunction<? super Throwable, ServerRequest, Mono<ServerResponse>> responseProvider) {
344+
public <T extends ServerResponse> RouterFunctions.Builder onError(Predicate<? super Throwable> predicate,
345+
BiFunction<? super Throwable, ServerRequest, Mono<T>> responseProvider) {
341346

342347
Assert.notNull(predicate, "Predicate must not be null");
343348
Assert.notNull(responseProvider, "ResponseProvider must not be null");

0 commit comments

Comments
 (0)