scalatra 应用程序中使用的 json4s 抛出 "com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input"

json4s used in scalatra application throws "com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input"

scalatra 应用程序中使用的 json4s 在通过浏览器发出 POST 请求时抛出“com.fasterxml.jackson.databind.JsonMappingException:由于输入结束没有要映射的内容”。

我有一个 ScalatraServlet 来处理从浏览器提交的表单。这是 Servlet。

class PagesController(service: RecordService) extends ScalatraServlet with JacksonJsonSupport  {

  post("/addRecord") {
    contentType = "text/html"
    //implicit val formats = DefaultFormats
    val jsonPayload = request.body
    println(s"payload: $jsonPayload")
    val x = parse(request.body)
    println(s"parsed: $x")
    val record = x.extract[MRecord]
    println(s"object: $record")
    service.add(Record(0, "Mocked data"))
    println(s"added $recordModel")
    redirect(URL.LANDING_PAGE_URL)
  }

当我运行 POST 通过 cli/rest-client 请求内容类型为 appplication/www-form-url-encode 时,没有这样的错误,我可以从 println 语句中确认。但是,当浏览器提交表单时,“com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容”

为什么只在提交表单时出现此异常,而通过 REST 提交时不会出现此异常client/cli?

看起来您的代码期望请求正文是 JSON,但浏览器表单提交 param_name1=param_value1&param_name2=param_value2 作为请求正文。如果您的表单中有一个名为 json 的字段包含 JSON,您可能会得到一个 JSON,如下所示:

post("/addRecord") {
  val jsonPayload = params("json")
  val x = parse(jsonPayload)
  ...
}

顺便说一句,Scalatra 2.7.0 中使用的 json4s 版本是 3.6.7。最好升级到这个版本:https://github.com/scalatra/scalatra/blob/v2.7.0/project/Dependencies.scala#L55