Обработка сбоя обновления в Play 2.5 и ReactiveMongo

Я написал простой API для отдыха, который добавит данные музыкальной дорожки в mongodb.

Я могу успешно записать трек, однако я хотел бы обработать случай ошибки.

Мой код, как показано ниже -

  def saveTrack = Action.async(parse.json) { 
     import model.Track.trackFormat
     implicit request =>
    request.body.validate[Track].map { data =>
      trackService.save(data).onComplete {
        case Success(value) => Ok(Json.obj("message" -> Messages("track.save.ack")))
        case Failure(e) => Ok(Json.obj("message" -> Messages("track.save.nack")))
    }
    }
    Future.successful(Ok(Json.obj("message" -> Messages("track.save.fin"))))
  }

Предположим, что в trackService.save(data) произошел какой-то сбой, тогда я хочу вернуть код ошибки. Мне интересно, как этого добиться.

Спасибо, Пари.


person Pari    schedule 16.03.2017    source источник
comment
Вы можете вернуть код ошибки в case Failure no ?   -  person alifirat    schedule 16.03.2017
comment
Либо это успех, либо неудача, он выполняет только Future.successful(Ok(Json.obj(message -> Messages(track.save.fin))))   -  person Pari    schedule 16.03.2017
comment
а вы хотите выполнить Ok(Json.obj("message" -> Messages("track.save.nack"))) в случае неудачи? Верно ?   -  person alifirat    schedule 16.03.2017
comment
Это правильно   -  person Pari    schedule 16.03.2017


Ответы (1)


def saveTrack = Action.async(parse.json) { implicit request =>
    request
      .body
      .validate[Track]
      .map { data =>
        trackService.save(data).map { v =>
          Ok(Json.toJson(Json.obj("message" -> Messages("ack"))))
        }.recover {
          case _ =>
            Ok(Json.toJson(Json.obj("message" -> Messages("nack"))))
        }
      }.getOrElse {Future.successful(BadRequest(Json.obj("error" -> "bad json")))
    }
  }

Используйте recover для обработки ошибок и getOrElse в случае, если тело json не соответствует вашей модели.

person alifirat    schedule 16.03.2017
comment
Спасибо. Ваше решение работает. Мне просто нужно было изменить - }.getOrElse { Future.successful(BadRequest(Json.obj(ошибка -> плохой json))) } - person Pari; 16.03.2017