如何打破REST控制器,在斯卡拉返回动作/播放框架(How to break REST contro

2019-11-03 02:06发布

我有一个运行一些代码控制器,I包装在try / catch语句一些代码,希望捕捉过程中,打破控制器运行并返回错误。
它不回来,我如何包装的要求我的动作功能反应?

样品:

def updateProduct(productId:String,lang: String, t: String) = Action {
request =>
  request.body.asJson.map {
    json =>
    var product:Product=null 
    try
    {
      product = json.as[Product]
    }        
    catch
    {
        case ex: Exception => {
          val errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.InvalidParameters, ex.getMessage, 500)
          return InternalServerError(Json.toJson(errorResponse)) //Does not stop,
          }
    }

    val response = productService.updateProduct(UpdateProductRequest(lang,t,productId,product))

    if (response.isError)
    {
        InternalServerError(Json.toJson(response))
    }
    else
    {
      Ok(Json.toJson(response))
    }}.getOrElse {
    Logger.warn("Bad json:" + request.body.asText.getOrElse("No data in body"))
      var errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.GeneralError, "Error processing request", 500)
      errorResponse.addMessage("No data in body")
      Ok(Json.toJson(errorResponse))
      }
  }

我得到的错误:

method updateProduct has return statement; needs result type

Answer 1:

当你使用return你一定要,因为它说,使用一个明确的返回类型。 斯卡拉将不能推断它。

因此,举例来说:

def fails(i: Int) = return (i+1)       // Doesn't compile
def works(i: Int): Int = return (i+1)  // Does

我不知道有什么共同的超OkInternalServerError是,但是这将是你以后。 如果它是一个无用的类型像AnyRef (即Object ),使用Either或等值可能是一个好主意(即Left(InternalServerError/*...*/) Right(Ok/*...*/)



文章来源: How to break REST controller that return Action in Scala/Play framework