Scalatra应用中json4s处理浏览器表单POST请求报JsonMappingException原因
异常触发原因
- 浏览器提交原生POST表单时的默认行为触发了Scalatra的自动表单解析逻辑:浏览器提交普通表单时默认会将请求头
Content-Type设为application/x-www-form-urlencoded,请求体为key1=value1&key2=value2格式的键值对字符串。Scalatra收到符合该格式规则的请求后,会自动将请求体内容解析到params全局集合中,解析完成后会清空原始request.body的内容。你在代码中直接读取request.body拿到的是空字符串,json4s解析空内容就会抛出No content to map due to end-of-input异常。 - CLI/REST客户端提交无报错的原因:你在使用CLI/REST客户端发起请求时,虽然手动指定了
Content-Type为application/x-www-form-urlencoded(注意正确拼写应为application/x-www-form-urlencoded),但实际请求体传入的是符合JSON格式的字符串,不符合表单键值对的格式规则,Scalatra自动解析表单失败,就不会清空request.body的内容,因此可以正常读取到完整的JSON字符串完成解析。 - 补充:你当前的代码逻辑是按接收JSON请求编写的,本身就不匹配浏览器原生表单提交的场景,就算
request.body没有被清空,直接拿表单格式的字符串做JSON解析依然会抛出格式错误。
修复方案
- 如果你要兼容浏览器原生表单提交:移除JSON解析逻辑,直接从
params集合中读取对应字段构造MRecord对象即可,不需要用到json4s相关能力。 - 如果你要统一用JSON格式接收请求:需要调整前端提交逻辑,浏览器原生表单不支持直接提交JSON格式,需要通过JS异步提交(如fetch/axios),指定请求头
Content-Type: application/json,同时传入序列化后的JSON字符串作为请求体。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

