【问题标题】:Throwing exception when Actor returns Future[Option[None]] Akka HttpActor返回Future[Option[None]] Akka Http时抛出异常
【发布时间】:2020-07-01 07:31:24
【问题描述】:

我有一个案例类

case class Fare(flightNumber: String, flightDate: LocalDate, amount: Int)

和一个演员

class FareDb extends Actor with ActorLogging {

  import FareDb._

  var fares: List[Fare] = List()

  override def receive: Receive = {
    case AddFare(fare) =>
      log.info(s"Adding fare $fare")
      fares = fares :+ fare

    case GetFare(flightNumber, flightDate) =>
      log.info(s"Getting Fare for FlightNumber $flightNumber and FlightDate $flightDate")
      sender() ! fares.find { fare => (flightNumber == fare.flightNumber & flightDate == fare.flightDate) }
  }

}

我也有路线

object FareController extends App with FareJsonProtocol with SprayJsonSupport{
    val fareRoutes =
        (path("api" / "fare") & get & extractLog) { log =>
          parameter(Symbol("flightNumber").as[String],
            Symbol("flightDate").as(stringToLocalDate)) { (flightNumber: String, flightDate: LocalDate) =>
            log.info(s"Searching for Fare with FlightNumber $flightNumber & FlightDate: $flightDate")
            val fareFuture: Future[Option[Fare]] = (fareDb ? GetFare(flightNumber, flightDate)).mapTo[Option[Fare]]
            complete(fareFuture)
          }
        }
}

当我搜索票价并使用航班号和航班日期“询问”Actor 时,它会返回 Future[Option[Fare]]。如果它返回票价,那么一切都很好。我可以像使用 SprayJson 一样使用 complete(fareFuture)。但是如何迎合未来[无]?我想为空结果抛出异常并相应地发送 HttpResponse 。我们如何做到这一点?谢谢。

【问题讨论】:

    标签: scala akka akka-http


    【解决方案1】:

    我假设您希望在您的未来返回 None 时返回 404。你不需要抛出异常来处理这种情况。

    您可以通过以下方式修改路由来处理None

    请执行以下操作,而不是 complete(fareFuture)

    onSuccess(fareFuture) {
      case Some(fare) => complete(StatusCodes.OK -> fare)
      case None => complete(StatusCodes.NotFound)
    }
    
    

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多