在Play 2.4.x中返回JSON 404错误

时间:2015-08-25 19:18:56

标签: java json scala playframework playframework-2.0

我想在用户点击不存在的路由时返回自定义404消息。我已经到了:

package controllers

import play.mvc.Results
import play.api.mvc.Results._
import play.api.GlobalSettings
import play.api.mvc.Result
import play.mvc.Http.RequestHeader
import play.libs.{F, Json}

import scala.concurrent.Future

/**
 * Created by ethan on 8/25/15.
 */
object Global extends GlobalSettings {

  override def onHandlerNotFound(request: RequestHeader): Result = {
    NotFound(Json.newObject())
  }

}

但是编译器说method onHandlerNotFound overrides nothing。我相信这是因为我将返回内容的类型更改为JSON对象,而不是HTML。

这样可行:

override def onHandlerNotFound(request: RequestHeader): Result = {
  Future.successful(NotFound(views.html.errors.notFoundPage()))
}

但我不想要HTML错误页面,我想要一个JSON响应。

Future.successful(NotFound(Json.newObject()))

也不起作用。

如何让我的API返回JSON 404? (这也适用于500个错误,我遇到了同样的问题)。

  • 播放2.4.2
  • Scala 2.11.6

修改 有效的最终代码:

import play.api._
import play.api.libs.json._
import play.api.mvc._
import play.api.mvc.Results._
import scala.concurrent.Future

object Global extends GlobalSettings {

  override def onHandlerNotFound(request: RequestHeader) = {
    Future.successful(NotFound(Json.obj("error" -> "Not Found")))
  }
}

1 个答案:

答案 0 :(得分:1)

您正在混合使用Java和Scala API。在Scala中,仅从play.api.*导入。

编译器是正确的 - 您的onHandlerNotFound没有覆盖任何内容,因为play.api.GlobalSettings没有定义一个采用play.mvc.Http.RequestHeader的名称的方法,而且#39} ;来自Java API的sa类型。您应该使用play.api.mvc.RequestHeader

结果类型和JSON库也是如此。这两者本身并不兼容,您需要确保不要在Scala中从Java API导入,反之亦然。