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

我正在开发一个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作为字符串?

当Spring MVC找到与URL路径匹配的请求映射但参数(或标题或某些内容)与处理程序方法所期望的不匹配时,您通常会看到此类错误。

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

如果你有一个你期望的JSON对象的java模型,那么你可以用你的doSomething声明中的String参数替换它,例如

public void doSomething(@RequestBody MyObject myobj) {

如果您没有与JSON匹配的Java对象,那么您可以尝试通过使用Map替换String类型来使其工作,并查看是否使您更接近工作解决方案。

您还可以打开Spring MVC中的调试日志记录,以获取有关它为什么是错误请求的更多信息。

编辑:根据您在评论中的要求,您可以简单地将HttpServletRequest注入您的方法并自己阅读正文。

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

我们有一种情况,我们想要一些控制器方法将POST主体映射到bean ,以及我们只需要原始String的其他方法。 要使用@RequestBody 注释完成此操作,您需要配置多个消息转换器,例如……

                       

然后,对各种方法的请求必须指定具有适当值的“ content-type ”标头。 对于请求主体映射到JAXB bean的那些方法,请指定“ application/xml ”。 对于请求体是String的那些 ,使用“ text/plain ”。

您可以尝试完全避免使用@RequestBody ,而是直接通过InputStream / ReaderWebRequest / HttpServletRequest获取请求体。

在我的情况下是因为json没有引用字段名称。 例如,这是不被接受的:

 { entity: "OneEntity"} 

但是这一个是的:

 { "entity": "OneEntity"} 

我还没有找到如何在spring上下文中配置对象映射。 我知道有一个JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,但我不知道如何设置对象映射器。

如果您的Content-type是“application / json”并且您的第一个messageConvertor不是org.springframework.http.converter.StringHttpMessageConverter,那么Spring无法正常工作。 就我而言,我这样做了:

                                                  

对于我的弹簧版本更新它只是一个“现在必要。”XXX“而不是XXX,一切都工作正常,你有它。内容类型的应用程序/ json