当前位置: 首页 > 知识库问答 >
问题:

在Spring中读取内容类型的Application/JSON

太叔飞翰
2023-03-14

就像在tring-to-use-spring-boot-rest-to-read-json-string-from-post中一样,我希望从Spring RestController中的POST请求中读取json负载。使用内容类型“text/plain”没有问题,但是使用“application/json”,反序列化失败,我得到一个MessageNotReadable异常。但实际上内容再简单不过了,它只是一个空的json对象“{}”。会不会是缺少了所需的转换器?我使用的是Spring Root 1.2.3版。

@RequestMapping(value = "/deepdefinitions", method = POST, headers = "Accept=application/json")
@ResponseBody
public Definitions createOrUpdateDefinitions(HttpEntity<String> httpEntity) throws IOException { ... }

卷曲呼叫

curl -H  "Content-type: application/json" -X POST -d '{}' http://localhost:8080/deepdefinitions

错误

{"timestamp":1434397457853,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Could not read JSON: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: org.apache.catalina.connector.CoyoteInputStream@122f9ce3; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: org.apache.catalina.connector.CoyoteInputStream@122f9ce3; line: 1, column: 1]","path":"/deepdefinitions"}

共有1个答案

杭胜
2023-03-14

从SpringRest指南:

acceptcontent-typeHTTP头可用于描述HTTP请求中发送或请求的内容。如果客户端请求JSON中的响应,则可以将accept设置为application/json。相反,在发送数据时,将content-type设置为application/xml会告诉客户端请求中发送的数据是XML。

控制器似乎只处理Accept标头:

@RequestMapping(value = "/deepdefinitions", method = POST, headers = "Accept=application/json")
@RequestMapping(value = "/deepdefinitions", method = POST, headers = "Accept=application/json, Content-type=application/json")

@requestmapping注释中还有consumesproduct元素可用。

Spring MVC文档建议:

虽然可以使用媒体类型通配符匹配content-typeaccept头值(例如,“content-type=text/*”将匹配“text/plain”和“text/html”),但建议分别使用consumesproduct条件。它们是专门为这一目的而设计的。

根据您的相关帖子,您应该将您的方法签名更改为:

@ResponseBody
public Definitions createOrUpdateDefinitions(@RequestBody String value, HttpEntity<String> httpEntity) throws IOException

我认为你也应该改变你的curl命令如下。这是因为{}(JavaScript Object literal)将映射到对象,而要映射到字符串,您应该使用空字符串literal。

curl -H "Content-type: application/json" -X POST -d '' http://localhost:8080/deepdefinitions
 类似资料:
  • 嗨,有人能帮我处理这个错误吗?当我使用邮递员发送邮件请求时,这里是我的控制器 这就是我使用postman发送json的方式 我正在尝试搜索如何修复它,但错误仍然存在 编辑:这是邮递员的标题 提前致谢

  • 我的控制器如下所示: 我已经尝试将“consumes”更改为将APPLICATION_OCTET_STREAM_VALUE删除为MULTIPART_FORM_DATA_VALUE,也尝试删除它,但这些都没有帮助。 如果你需要更多的信息,请告诉我。谢了。

  • 问题内容: 我有一个映射有以下注释的控制器: 我返回了一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是唯一的。为什么未设置内容类型? 我的: 我的: 使用WildFly 8.1作为我的应用服务器。 问题答案: 要了解的第一件事是,在元素 仅用于限制请求处理程序的映射。 它什么也没做。 然后,假设您的方法的返回类型为,并带有注释,则将通过处理

  • 我有一个用以下注释映射的控制器: 我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是,而是简单的。为什么没有设置内容类型? 我的: 我的: 使用Wildfly8.1作为我的应用服务器。

  • 我的服务器资源: 我的客户资源: 我的Build.Gradle文件:

  • 我有一个API我正在测试。API接收POST请求并像这样读取它 当我在“application/json;charset=UTF-8”中发送一个POST请求时,所有工作都很好。 它打印如下: 我可以正确地读取数据。 然而,我的问题是,当我以同样的方式发送数据时,我设置了内容类型“application/x-www-form-urlencoded;charset=utf-8” 测试是一样的,只是内容