小编典典

Spring MVC:不反序列化JSON请求主体

spring-mvc

我正在从事Spring
MVC项目,我需要做的任务之一是要求我在POST请求中具有由用户发送的一串JSON数据。我知道Spring会使用Jackson向对象反序列化JSON,但是如果我尝试以下操作:

@RequestMapping(value = "/test", method = RequestMethod.POST)
public void doSomething(@RequestBody String json) {
    // do something
}

我只是简单地收到HTTP 400 Bad Request(“客户端发送的请求在语法上是不正确的。”)。

如何获取客户端以字符串形式发送的原始JSON?


阅读 533

收藏
2020-06-01

共1个答案

小编典典

当Spring MVC找到与URL路径匹配的请求映射,但参数(或标头或其他内容)与处理程序方法期望的不匹配时,通常会看到这种类型的错误。

如果使用@RequestBody批注,那么我相信Spring
MVC希望将POST请求的整个主体映射到Object。我猜你的身体不仅仅是一个字符串,而是一些完整的JSON对象。

如果您期望使用JSON对象的Java模型,则可以用doSomething声明中的String参数替换String参数,例如

public void doSomething(@RequestBody MyObject myobj) {

如果您没有与JSON相匹配的Java对象,则可以尝试通过将String类型替换为a 来使其工作,Map<String, Object>并查看是否更接近可行的解决方案。

您还可以在Spring MVC中打开调试日志记录,以获取有关为何请求失败的更多信息。

编辑: 考虑到注释中的要求,您可以简单地将HttpServletRequest注入到您的方法中并自己读取主体。

public void doSomething(HttpServletRequest request) {
  String jsonBody = IOUtils.toString( request.getInputStream());
  // do stuff
}
2020-06-01