Skip to content

Commit f8a0e3d

Browse files
committed
Support RenderingResponse in RouterFunctionDsl
Issue: SPR-17244
1 parent 259b2ca commit f8a0e3d

File tree

2 files changed

+51
-39
lines changed

2 files changed

+51
-39
lines changed

spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/RouterFunctionDsl.kt

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.springframework.http.HttpMethod
2121
import org.springframework.http.HttpStatus
2222
import org.springframework.http.MediaType
2323
import reactor.core.publisher.Mono
24+
import reactor.core.publisher.cast
2425
import java.net.URI
2526

2627
/**
@@ -153,8 +154,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
153154
* Route to the given handler function if the given request predicate applies.
154155
* @see RouterFunctions.route
155156
*/
156-
fun GET(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
157-
routes += RouterFunctions.route(RequestPredicates.GET(pattern), HandlerFunction { f(it) })
157+
fun GET(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
158+
routes += RouterFunctions.route(RequestPredicates.GET(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
158159
}
159160

160161
/**
@@ -168,8 +169,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
168169
* Route to the given handler function if the given request predicate applies.
169170
* @see RouterFunctions.route
170171
*/
171-
fun HEAD(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
172-
routes += RouterFunctions.route(RequestPredicates.HEAD(pattern), HandlerFunction { f(it) })
172+
fun HEAD(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
173+
routes += RouterFunctions.route(RequestPredicates.HEAD(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
173174
}
174175

175176
/**
@@ -183,8 +184,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
183184
* Route to the given handler function if the given POST predicate applies.
184185
* @see RouterFunctions.route
185186
*/
186-
fun POST(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
187-
routes += RouterFunctions.route(RequestPredicates.POST(pattern), HandlerFunction { f(it) })
187+
fun POST(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
188+
routes += RouterFunctions.route(RequestPredicates.POST(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
188189
}
189190

190191
/**
@@ -198,8 +199,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
198199
* Route to the given handler function if the given PUT predicate applies.
199200
* @see RouterFunctions.route
200201
*/
201-
fun PUT(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
202-
routes += RouterFunctions.route(RequestPredicates.PUT(pattern), HandlerFunction { f(it) })
202+
fun PUT(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
203+
routes += RouterFunctions.route(RequestPredicates.PUT(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
203204
}
204205

205206
/**
@@ -213,8 +214,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
213214
* Route to the given handler function if the given PATCH predicate applies.
214215
* @see RouterFunctions.route
215216
*/
216-
fun PATCH(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
217-
routes += RouterFunctions.route(RequestPredicates.PATCH(pattern), HandlerFunction { f(it) })
217+
fun PATCH(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
218+
routes += RouterFunctions.route(RequestPredicates.PATCH(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
218219
}
219220

220221
/**
@@ -230,8 +231,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
230231
* Route to the given handler function if the given DELETE predicate applies.
231232
* @see RouterFunctions.route
232233
*/
233-
fun DELETE(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
234-
routes += RouterFunctions.route(RequestPredicates.DELETE(pattern), HandlerFunction { f(it) })
234+
fun DELETE(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
235+
routes += RouterFunctions.route(RequestPredicates.DELETE(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
235236
}
236237

237238
/**
@@ -247,8 +248,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
247248
* Route to the given handler function if the given OPTIONS predicate applies.
248249
* @see RouterFunctions.route
249250
*/
250-
fun OPTIONS(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
251-
routes += RouterFunctions.route(RequestPredicates.OPTIONS(pattern), HandlerFunction { f(it) })
251+
fun OPTIONS(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
252+
routes += RouterFunctions.route(RequestPredicates.OPTIONS(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
252253
}
253254

254255
/**
@@ -264,8 +265,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
264265
* Route to the given handler function if the given accept predicate applies.
265266
* @see RouterFunctions.route
266267
*/
267-
fun accept(mediaType: MediaType, f: (ServerRequest) -> Mono<ServerResponse>) {
268-
routes += RouterFunctions.route(RequestPredicates.accept(mediaType), HandlerFunction { f(it) })
268+
fun accept(mediaType: MediaType, f: (ServerRequest) -> Mono<out ServerResponse>) {
269+
routes += RouterFunctions.route(RequestPredicates.accept(mediaType), HandlerFunction<ServerResponse> { f(it).cast() })
269270
}
270271

271272
/**
@@ -281,8 +282,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
281282
* Route to the given handler function if the given contentType predicate applies.
282283
* @see RouterFunctions.route
283284
*/
284-
fun contentType(mediaType: MediaType, f: (ServerRequest) -> Mono<ServerResponse>) {
285-
routes += RouterFunctions.route(RequestPredicates.contentType(mediaType), HandlerFunction { f(it) })
285+
fun contentType(mediaType: MediaType, f: (ServerRequest) -> Mono<out ServerResponse>) {
286+
routes += RouterFunctions.route(RequestPredicates.contentType(mediaType), HandlerFunction<ServerResponse> { f(it).cast() })
286287
}
287288

288289
/**
@@ -298,8 +299,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
298299
* Route to the given handler function if the given headers predicate applies.
299300
* @see RouterFunctions.route
300301
*/
301-
fun headers(headersPredicate: (ServerRequest.Headers) -> Boolean, f: (ServerRequest) -> Mono<ServerResponse>) {
302-
routes += RouterFunctions.route(RequestPredicates.headers(headersPredicate), HandlerFunction { f(it) })
302+
fun headers(headersPredicate: (ServerRequest.Headers) -> Boolean, f: (ServerRequest) -> Mono<out ServerResponse>) {
303+
routes += RouterFunctions.route(RequestPredicates.headers(headersPredicate), HandlerFunction<ServerResponse> { f(it).cast() })
303304
}
304305

305306
/**
@@ -314,8 +315,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
314315
* Route to the given handler function if the given method predicate applies.
315316
* @see RouterFunctions.route
316317
*/
317-
fun method(httpMethod: HttpMethod, f: (ServerRequest) -> Mono<ServerResponse>) {
318-
routes += RouterFunctions.route(RequestPredicates.method(httpMethod), HandlerFunction { f(it) })
318+
fun method(httpMethod: HttpMethod, f: (ServerRequest) -> Mono<out ServerResponse>) {
319+
routes += RouterFunctions.route(RequestPredicates.method(httpMethod), HandlerFunction<ServerResponse> { f(it).cast() })
319320
}
320321

321322
/**
@@ -329,8 +330,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
329330
* Route to the given handler function if the given path predicate applies.
330331
* @see RouterFunctions.route
331332
*/
332-
fun path(pattern: String, f: (ServerRequest) -> Mono<ServerResponse>) {
333-
routes += RouterFunctions.route(RequestPredicates.path(pattern), HandlerFunction { f(it) })
333+
fun path(pattern: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
334+
routes += RouterFunctions.route(RequestPredicates.path(pattern), HandlerFunction<ServerResponse> { f(it).cast() })
334335
}
335336

336337
/**
@@ -343,8 +344,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
343344
* Route to the given handler function if the given pathExtension predicate applies.
344345
* @see RouterFunctions.route
345346
*/
346-
fun pathExtension(extension: String, f: (ServerRequest) -> Mono<ServerResponse>) {
347-
routes += RouterFunctions.route(RequestPredicates.pathExtension(extension), HandlerFunction { f(it) })
347+
fun pathExtension(extension: String, f: (ServerRequest) -> Mono<out ServerResponse>) {
348+
routes += RouterFunctions.route(RequestPredicates.pathExtension(extension), HandlerFunction<ServerResponse> { f(it).cast() })
348349
}
349350

350351
/**
@@ -358,8 +359,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
358359
* Route to the given handler function if the given pathExtension predicate applies.
359360
* @see RouterFunctions.route
360361
*/
361-
fun pathExtension(predicate: (String) -> Boolean, f: (ServerRequest) -> Mono<ServerResponse>) {
362-
routes += RouterFunctions.route(RequestPredicates.pathExtension(predicate), HandlerFunction { f(it) })
362+
fun pathExtension(predicate: (String) -> Boolean, f: (ServerRequest) -> Mono<out ServerResponse>) {
363+
routes += RouterFunctions.route(RequestPredicates.pathExtension(predicate), HandlerFunction<ServerResponse> { f(it).cast() })
363364
}
364365

365366
/**
@@ -374,8 +375,8 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
374375
* Route to the given handler function if the given queryParam predicate applies.
375376
* @see RouterFunctions.route
376377
*/
377-
fun queryParam(name: String, predicate: (String) -> Boolean, f: (ServerRequest) -> Mono<ServerResponse>) {
378-
routes += RouterFunctions.route(RequestPredicates.queryParam(name, predicate), HandlerFunction { f(it) })
378+
fun queryParam(name: String, predicate: (String) -> Boolean, f: (ServerRequest) -> Mono<out ServerResponse>) {
379+
routes += RouterFunctions.route(RequestPredicates.queryParam(name, predicate), HandlerFunction<ServerResponse> { f(it).cast() })
379380
}
380381

381382
/**
@@ -393,17 +394,17 @@ open class RouterFunctionDsl(private val init: RouterFunctionDsl.() -> Unit) : (
393394
* Route to the given handler function if the given request predicate applies.
394395
* @see RouterFunctions.route
395396
*/
396-
operator fun RequestPredicate.invoke(f: (ServerRequest) -> Mono<ServerResponse>) {
397-
routes += RouterFunctions.route(this, HandlerFunction { f(it) })
397+
operator fun RequestPredicate.invoke(f: (ServerRequest) -> Mono<out ServerResponse>) {
398+
routes += RouterFunctions.route(this, HandlerFunction<ServerResponse> { f(it).cast() })
398399
}
399400

400401
/**
401402
* Route to the given handler function if the given predicate (String
402403
* processed as a path predicate) applies.
403404
* @see RouterFunctions.route
404405
*/
405-
operator fun String.invoke(f: (ServerRequest) -> Mono<ServerResponse>) {
406-
routes += RouterFunctions.route(RequestPredicates.path(this), HandlerFunction { f(it) })
406+
operator fun String.invoke(f: (ServerRequest) -> Mono<out ServerResponse>) {
407+
routes += RouterFunctions.route(RequestPredicates.path(this), HandlerFunction<ServerResponse> { f(it).cast() })
407408
}
408409

409410
/**

spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/RouterFunctionDslTests.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,7 +43,7 @@ class RouterFunctionDslTests {
4343

4444
@Test
4545
fun accept() {
46-
val request = builder().header(ACCEPT, APPLICATION_ATOM_XML_VALUE).build()
46+
val request = builder().uri(URI("/content")).header(ACCEPT, APPLICATION_ATOM_XML_VALUE).build()
4747
StepVerifier.create(sampleRouter().route(request))
4848
.expectNextCount(1)
4949
.verifyComplete()
@@ -63,7 +63,7 @@ class RouterFunctionDslTests {
6363

6464
@Test
6565
fun contentType() {
66-
val request = builder().header(CONTENT_TYPE, APPLICATION_OCTET_STREAM_VALUE).build()
66+
val request = builder().uri(URI("/content")).header(CONTENT_TYPE, APPLICATION_OCTET_STREAM_VALUE).build()
6767
StepVerifier.create(sampleRouter().route(request))
6868
.expectNextCount(1)
6969
.verifyComplete()
@@ -112,6 +112,14 @@ class RouterFunctionDslTests {
112112
.verifyComplete()
113113
}
114114

115+
@Test
116+
fun rendering() {
117+
val request = builder().uri(URI("/rendering")).build()
118+
StepVerifier.create(sampleRouter().route(request).flatMap { it.handle(request) })
119+
.expectNextMatches { it is RenderingResponse}
120+
.verifyComplete()
121+
}
122+
115123

116124
private fun sampleRouter() = router {
117125
(GET("/foo/") or GET("/foos/")) { req -> handle(req) }
@@ -123,8 +131,10 @@ class RouterFunctionDslTests {
123131
}
124132
"/foo/" { handleFromClass(it) }
125133
}
126-
accept(APPLICATION_ATOM_XML, ::handle)
127-
contentType(APPLICATION_OCTET_STREAM, ::handle)
134+
"/content".nest {
135+
accept(APPLICATION_ATOM_XML, ::handle)
136+
contentType(APPLICATION_OCTET_STREAM, ::handle)
137+
}
128138
method(PATCH, ::handle)
129139
headers { it.accept().contains(APPLICATION_JSON) }.nest {
130140
GET("/api/foo/", ::handle)
@@ -141,6 +151,7 @@ class RouterFunctionDslTests {
141151
}
142152
}
143153
path("/baz", ::handle)
154+
GET("/rendering") { RenderingResponse.create("index").build() }
144155
}
145156
}
146157

0 commit comments

Comments
 (0)