handleRejections

Signature

def handleRejections(handler: RejectionHandler): Directive0

Description

Using this directive is an alternative to using a global implicitly defined RejectionHandler that applies to the complete route.

See Rejections for general information about options for handling rejections.

Example

Scala
val totallyMissingHandler = RejectionHandler.newBuilder()
  .handleNotFound { complete((StatusCodes.NotFound, "Oh man, what you are looking for is long gone.")) }
  .handle { case ValidationRejection(msg, _) => complete((StatusCodes.InternalServerError, msg)) }
  .result()
val route =
  pathPrefix("handled") {
    handleRejections(totallyMissingHandler) {
      path("existing")(complete("This path exists")) ~
        path("boom")(reject(new ValidationRejection("This didn't work.")))
    }
  }

// tests:
Get("/handled/existing") ~> route ~> check {
  responseAs[String] shouldEqual "This path exists"
}
Get("/missing") ~> Route.seal(route) /* applies default handler */ ~> check {
  status shouldEqual StatusCodes.NotFound
  responseAs[String] shouldEqual "The requested resource could not be found."
}
Get("/handled/missing") ~> route ~> check {
  status shouldEqual StatusCodes.NotFound
  responseAs[String] shouldEqual "Oh man, what you are looking for is long gone."
}
Get("/handled/boom") ~> route ~> check {
  status shouldEqual StatusCodes.InternalServerError
  responseAs[String] shouldEqual "This didn't work."
}
Java
import akka.http.javadsl.server.Directives;

import static akka.http.javadsl.server.Directives.complete;
import static akka.http.javadsl.server.Directives.handleRejections;
import static akka.http.javadsl.server.Directives.pathPrefix;
import static akka.http.javadsl.server.Directives.reject;

    final RejectionHandler totallyMissingHandler = RejectionHandler.newBuilder()
      .handleNotFound(complete(StatusCodes.NOT_FOUND, "Oh man, what you are looking for is long gone."))
      .handle(ValidationRejection.class, r -> complete(StatusCodes.INTERNAL_SERVER_ERROR, r.message()))
      .build();

    final Route route = pathPrefix("handled", () ->
      handleRejections(totallyMissingHandler, () ->
        Directives.route(
          path("existing", () -> complete("This path exists")),
          path("boom", () -> reject(Rejections.validationRejection("This didn't work.")))
        )
      )
    );

    // tests:
    testRoute(route).run(HttpRequest.GET("/handled/existing"))
      .assertEntity("This path exists");
    // applies default handler
    testRoute(route).run(HttpRequest.GET("/missing"))
      .assertStatusCode(StatusCodes.NOT_FOUND)
      .assertEntity("The requested resource could not be found.");
    testRoute(route).run(HttpRequest.GET("/handled/missing"))
      .assertStatusCode(StatusCodes.NOT_FOUND)
      .assertEntity("Oh man, what you are looking for is long gone.");
    testRoute(route).run(HttpRequest.GET("/handled/boom"))
      .assertStatusCode(StatusCodes.INTERNAL_SERVER_ERROR)
      .assertEntity("This didn't work.");
Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.