onSuccess
Signature¶
def onSuccess(unitFuture: Future[Unit]): Directive0
def onSuccess(simpleTypeFuture: Future[T]): Directive1[T]
def onSuccess(hlistFuture: Future[T_0 :: ... T_i ... :: HNil]): Directive[T_0 :: ... T_i ... :: HNil]
The signature shown is simplified and written in pseudo-syntax, the real signature uses magnets. [1].
[1] See The Magnet Pattern for an explanation of magnet-based overloading.
Description¶
Evaluates its parameter of type Future[T]
, and once it has been completed successfully, extracts its result as a value of type T
and passes it to the inner route.
If the future fails its failure throwable is bubbled up to the nearest ExceptionHandler
.
To handle the Failure
case manually as well, use onComplete, instead.
Example¶
sourceval route =
concat(
path("success") {
onSuccess(Future { "Ok" }) { extraction =>
complete(extraction)
}
},
path("failure") {
onSuccess(Future.failed[String](TestException)) { extraction =>
complete(extraction)
}
})
// tests:
Get("/success") ~> route ~> check {
responseAs[String] shouldEqual "Ok"
}
Get("/failure") ~> Route.seal(route) ~> check {
status shouldEqual InternalServerError
responseAs[String] shouldEqual "Unsuccessful future!"
}
sourceimport static org.apache.pekko.http.javadsl.server.Directives.complete;
import static org.apache.pekko.http.javadsl.server.Directives.onSuccess;
import static org.apache.pekko.http.javadsl.server.Directives.path;
final Route route =
path(
"success",
() ->
onSuccess(
CompletableFuture.supplyAsync(() -> "Ok"),
extraction -> complete(extraction)))
.orElse(
path(
"failure",
() ->
onSuccess(
CompletableFuture.supplyAsync(
() -> {
throw new RuntimeException();
}),
extraction -> complete("never reaches here"))));
testRoute(route).run(HttpRequest.GET("/success")).assertEntity("Ok");
testRoute(route)
.run(HttpRequest.GET("/failure"))
.assertStatusCode(StatusCodes.InternalServerError())
.assertEntity("There was an internal server error.");
1.0.1