简体   繁体   中英

akka http handleNotFound rejection is only working for POST method

i have the following akka http rejection handling code taken from https://doc.akka.io/docs/akka-http/current/routing-dsl/rejections.html

val message = "The requested resource could not be found."
  implicit def myRejectionHandler = RejectionHandler.newBuilder()

    .handleNotFound {
      complete(HttpResponse(NotFound
        ,entity = HttpEntity(ContentTypes.`application/json`, s"""{"rejection": "$message"}"""
      )))
    }.result()

      val route: Route = handleRejections(myRejectionHandler) {
        handleExceptions(myExceptionHandler) {
          concat(
            path("event-by-id") {
              get {
                parameters('id.as[String]) {
                  id =>
complete("id")
                }
              }
            }
            ,
            post {
              path("create-event") {
                entity(as[Event]) {
                  event =>
                        complete(OK, "inserted")
                }
              }
            }
          )
        }
      }
    }

 val bindingFuture = Http().bindAndHandle(route, hostName, port)

when i hit localhost:8080/random

i got the message

HTTP method not allowed, supported methods: POST

and when i select POST and hit localhost:8080/random i got the message

{
    "rejection": "The requested resource could not be found."
}

why i did not get the same message when my route request was GET ? in the docs the handleNotFound was working with GET request https://doc.akka.io/docs/akka-http/current/routing-dsl/rejections.html

This is happens, probably because of order of directives, you are using: in your configuration if incoming request does not match with event-by-id URL path, then it goes to the next handler, which expects that request should have POST method first of all, because post directive goes first, before path("create-event") .

What you can try to do is change directives order to the next one, for second route:

path("create-event") {
 post {
  entity(as[Event]) { event =>
     complete(OK, "inserted")
   }
 }
}

Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM