Как отправить сообщения на http-ответ из класса case?

Учитывая класс case с любым требованием

case class Foo(id: Int, value: Int) {
    require(value < 0 "value must be bigger than zero")
}

Можно ли скинуть эти сообщения на http?

val routes = pathPrefix("foos") {
    pathEnd {
      post {
        entity(as[Foo]) { foo =>
          saveFoo(foo) match {
            case Success(p) => {
              complete(StatusCodes.Created)
            }
            case Failure(f) => {
              println(f.getMessage) // unknown error
              complete(BadRequest, f.getMessage)
            }
          }
        }
      }
    } 

person coffee    schedule 24.12.2016    source источник


Ответы (1)


Инфраструктура Akka-HTTP уже преобразует все ошибки, возникающие во время демаршалинга, в ошибку 400 (BadRequest), а сообщение об исключении будет использоваться автоматически.

С вашим же кодом я получаю это поведение бесплатно. Небольшие изменения, которые я сделал:

  • ошибка бизнес-логики теперь 500, чтобы избежать путаницы

  • требование класса случая теперь соответствует сообщению (требуется > вместо <).


  case class Foo(id: Int, value: Int) {
    require(value > 0, "value must be bigger than zero")
  }

  def saveFoo(foo: Foo): Try[Unit] = Success(())

  val route = pathPrefix("foos") {
    pathEnd {
      post {
        entity(as[Foo]) { foo =>
          saveFoo(foo) match {
            case Success(p) => {
              complete(StatusCodes.Created)
            }
            case Failure(f) => {
              println(f.getMessage) // unknown error
              complete(StatusCodes.InternalServerError, f.getMessage)
            }
          }
        }
      }
    }
  }
person Stefano Bonetti    schedule 24.12.2016
comment
Я тоже так думал. Но сообщение от f.getMessage - неизвестная ошибка - person coffee; 24.12.2016
comment
Этот блок, где вы печатаете f.getMessage, оценивается в случае, если ваш метод saveFoo возвращает ошибку. Если вы печатаете f.getMessage, это означает, что рассортировка прошла нормально, а ошибка возникла позже. Отклонение несортируемых ошибок с помощью BadRequest происходит «под капотом», без необходимости добавления какого-либо кода. - person Stefano Bonetti; 24.12.2016