【问题标题】:json4s used in scalatra application throws "com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input"scalatra 应用程序中使用的 json4s 抛出“com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容”
【发布时间】:2021-11-04 16:50:02
【问题描述】:

当通过浏览器发出 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 以 content-type 为 appplication/www-form-url-encode 运行 POST 请求时,没有这样的错误,我可以从 println 语句。但是,当浏览器提交表单时,“com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input”

是什么原因导致这个异常只在表单提交时发生,而不是在通过 REST 客户端/cli 提交时发生?

【问题讨论】:

  • 你使用的是哪个版本的 scalatra 和 json4s?
  • Scalatra version : 2.7.0json4 is 3.5.5
  • 注意:Json4s 是 vulnerable under DoS/DoW attacks!
  • 当然。感谢您的来信。

标签: scala json4s scalatra


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2018-12-23
    • 2018-01-30
    • 2019-10-10
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多