我正在做一个Spring Boot项目,在这个项目中,我必须开发一个处理POST请求的API,其中包含一个JSON有效负载。
我正在寻找此示例文档: https://www.baeldung.com/spring-resttemplate-post-json
其中完成:
@PostMapping(
value = "/createPerson", consumes = "application/json", produces = "application/json")
public Person createPerson(@RequestBody Person person) {
return personService.saveUpdatePerson(person);
}
根据我的理解,这个 API 期望在请求正文中有一个 JSON 有效负载(因为我将consumptions = "application/json">放入@PostMapping注释中(,该有效负载将自动转换为Person类的实例。
这个推理正确吗?
如果我的推理是正确的,我有一个疑问:我的具体用例非常不同:我的 API 不知道哪种对象代表 JSON 有效负载(例如,它可能是人、动物或事物(。因此,API 无法确定在哪种对象中序列化收到的 JSON。
所以我想做的是:
- API 必须以某种方式接收原始 JSON 有效负载。
- 根据 JSON 内容,它会创建适当的对象(例如Person的实例或Animal的实例(。
这可能是一个聪明的解决方案? 我该怎么做才能检索原始 JSON 有效负载?
选项 1:Map<String, Object>
如果您只需要 JSON 字符串,请使用 Map 而不是 Person。这样就不会发生从 JSON 到对象的转换。
@PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
public Map<String, Object> createPerson(@RequestBody Map<String, Object> json) {
// Do whatever you want to do
}
如您所见,此方法还返回一个 Map,因此您也可以返回一个 JSON 字符串
选项 2:字符串
您也可以使用字符串。确保"消耗"设置为"MediaType.ALL_VALUE
@PostMapping(value = "demo", consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public String createPerson(@RequestBody String json) {
// Do whatever you want to do
return json;
}
尝试使用HttpEntity将原始正文作为字符串获取,然后将其转换为自定义对象:
@PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
public Person createPerson(HttpEntity<String> httpEntity) {
String body= httpEntity.getBody();
// convert your String to Person object or what ever using ObjectMapper
// ...
return personService.saveUpdatePerson(person);
}