onSuccess

Signature

def onSuccess(magnet: OnSuccessMagnet): Directive[magnet.Out]

Description

Evaluates its parameter of type Future[T]CompletionStage<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 ExceptionHandlerExceptionHandler.

To handle the Failure case manually as well, use onComplete, instead.

Example

Scala
val route =
  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!"
}
Java
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.");
The source code for this page can be found here.