scala - 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 提交时才发生此异常的原因是什么?
解决方案
看起来您的代码期望请求正文是 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
推荐阅读
- mime-types - 更改应用程序/xml 全局的默认服务首选项
- python - Python 类型:返回类型与 Java Clazz 中的 Clazz[T] 等泛型
- docker - 文件挂载为目录而不是 docker-in-docker (dind) 中的文件
- sql - 多列上的 CASE 表达式
- php - 将组数据填充到 Highcharts 上的特定系列
- python - 以全屏模式显示单个图像(如 powerpoint)
- flutter - 在 Dart 中导入整个文件和只导入带有 show 的类有什么区别?
- javascript - 如何使用 Directus Javascript SDK 进行条件过滤?
- android - 查找用户是否在锁定屏幕上禁用通知
- python - 如何将更新的DataFrame实时输入sql或db