如何在 Spring Boot REST API 中格式化返回的 json?
Posted
技术标签:
【中文标题】如何在 Spring Boot REST API 中格式化返回的 json?【英文标题】:How to format returned json in Spring Boot REST API? 【发布时间】:2021-05-16 11:31:25 【问题描述】:我使用 Spring Boot 创建了以下 REST API。
@RestController
public class PersonController
@Autowired
private PersonRepository PersonRepository;
@PostMapping(value="/Person", produces = "application/json")
public ResponseEntity<Person> addPerson(@RequestBody Person Person)
Person newPerson = PersonRepository.save(Person);
return new ResponseEntity<Person>(newPerson, HttpStatus.OK) ;
在 Postman 中我选择:
POST > http://localhost:8080/person > json
然后在正文字段中,我放置以下 json 并点击发送:
"id":"", "name":"john", "age":"40", "email":"test@test.com"
这是我得到的回报:
"name": "john",
"age": 40,
"email": "test@test.com",
"_links":
"self":
"href": "http://localhost:8080/person/10"
,
"person":
"href": "http://localhost:8080/person/10"
但是,我希望 json 以这种其他格式返回:
"id": 10,
"name": "john",
"age": 40,
"email": "test@test.com"
怎么做?
【问题讨论】:
【参考方案1】:看起来您也在使用 SpringDataRest,它根据您的实体公开 _links 等。我猜 SpringDataRest 的控制器是在您的请求中调用的,而不是您的自定义端点。尝试在您的控制器方法中记录一些内容以确保它被实际调用。 如果您的服务的另一部分不需要 SpringDataRest,则应删除依赖项。
【讨论】:
【参考方案2】:我刚刚发现了问题。
在控制器中的代码是:
@PostMapping(value="/person"....
当我在邮递员的时候:
http://localhost:8080/persons
(以字母s结尾)
因此它从未进入控制器方法。
当我从邮递员调用中删除 s 时,它可以正常工作并以我想要的方式返回 json。
现在...
有趣的是,当使用字母s调用时,它确实保存到db并返回json,即使映射不正确。
所以我决定在调试模式下运行(使用不正确的映射)并注意到它没有进入方法。
这很奇怪。如何正确保存并返回 json?
然后我决定注释掉所有方法并再次在邮递员上运行调用。
它再次将 json 保存到数据库并以第一种格式返回 json。
所以这似乎是在幕后以某种方式完成的,肯定不是通过我创建的方法。
【讨论】:
以上是关于如何在 Spring Boot REST API 中格式化返回的 json?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot JWT - 如何实现刷新令牌和注销 REST-API
如何在 Spring Boot REST API 中格式化返回的 json?
在 Spring-boot 中成功登录后如何限制 POST Rest Api 以供公共访问
如何在 Spring Boot Rest api 响应的 ResponseEntity 中添加自定义属性