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

标签 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())
  }

}

但是编译器说方法 onHandlerNotFound 不覆盖任何内容。我相信这是因为我将返回内容的类型更改为 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 个错误,我也遇到了同样的问题)。

  • Play 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")))
  }
}

最佳答案

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

编译器是正确的 - 您的 onHandlerNotFound 不会覆盖任何内容,因为 play.api.GlobalSettings 没有使用该名称定义采用 的方法play.mvc.Http.RequestHeader,这是 Java API 中的一种类型。您应该使用 play.api.mvc.RequestHeader

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

关于java - 在 Play 2.4.x 中返回 JSON 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32212257/

相关文章:

java - 使用 Jersey 在 Java 中发布 JSON 时出现 415 错误

json - Angular 4 api调用转向对json的响应返回undefined

scala - 在 Scala 中迭代三个以上的数组

java - 从子上下文引用在父上下文中创建的 Spring Singletons

java - 如何将“&”符号放入 Word 2007 .docx XML 文件中?

java - 从 Java 中的数组列表中删除连续的重复元素(带有派头)

java - 如何确保实现中泛型方法的类型?

javascript - Emberjs 中没有任何内容处理事件错误

scala - 使用 circe 将 Map[String, MyCaseClass] 编码为 Seq[String, String]

scala - 连接两个没有公共(public)列的数据框