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¶m_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
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¶m_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