首页 > 解决方案 > scalatra 应用程序中使用的 json4s 抛出“com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容”

问题描述

当通过浏览器发出 POST 请求时,scalatra 应用程序中使用的 json4s 会抛出“com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input”。

我有一个 ScalatraServlet 从浏览器提供 FORM 提交。这是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)
  }

当我通过 cli/rest-client 运行 POST 请求时,内容类型为appplication/www-form-url-encode,没有这样的错误,我可以从println语句中确认。但是,当浏览器提交表单时,“com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input”

仅当提交表单而不是通过 REST 客户端/cli 提交时才发生此异常的原因是什么?

标签: scalajson4sscalatra

解决方案


看起来您的代码期望请求正文是 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


推荐阅读