SpringBoot通过JSON传递请求参数的实例详解
作者:IT利刃出鞘
简介
本文用示例介绍SpringMVC如何通过JSON格式传递入参。
JSON格式使用post方式来请求,即:对应的注解为:@PostMapping。
@PostMapping注解的方法可以接收1个@RequestBody标记的参数和多个没有@RequestBody标记的参数。
代码
Entity
User.java
package com.example.demo.entity; import lombok.Data; import java.util.List; @Data public class User { private String name; private Integer age; private String[] password; private List<Integer> scoreArray; }
Account.java
package com.example.demo.entity; import lombok.Data; import java.io.Serializable; @Data public class Account implements Serializable { private String phoneNum; private String[] emails; }
Controller
package com.example.demo.controller; import com.example.demo.entity.User; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Arrays; import java.util.List; @RequestMapping("/json") @RestController public class JsonController { @PostMapping("/1") public User setUserNoAnnotation(User user, List<String> password, Integer[] scoreArray) { printUser(user); return user; } @RequestMapping("/2") public User setUserAnnotation(@RequestBody User user) { printUser(user); return user; } @RequestMapping("/3") public User setUserAnnotation1(@RequestBody User user, @RequestParam List<String> password, Integer[] scoreArray) { System.out.println(password); if (scoreArray != null) { System.out.println(Arrays.asList(scoreArray)); } else { System.out.println("scoreArray = null"); } System.out.println(); printUser(user); return user; } @RequestMapping("/4") public User setUserAnnotation2(@RequestBody User user, @RequestBody List<String> password, @RequestBody Integer[] scoreArray) { if (password != null) { System.out.println(password); } else { System.out.println("password = null"); } if (scoreArray != null) { System.out.println(Arrays.asList(scoreArray)); } else { System.out.println("scoreArray = null"); } System.out.println(); printUser(user); return user; } private void printUser(User user){ System.out.println("name : " + user.getName()); System.out.println("password : " + Arrays.asList(user.getPassword())); System.out.println("scoreArray : " + user.getScoreArray()); System.out.println("acount.phoneNum : " + user.getAccount().getPhoneNum()); System.out.println("account.emails : " + Arrays.asList(user.getAccount().getEmails())); } }
测试
为方便测试,我用了knife4j。
测试前提
json的body
{ "name": "Jarvis", "password": [ "ab", "cd" ], "scoreArray": [ 99, 98 ], "account": { "phoneNum": "123", "emails": [ "123@qq.com", "456@163.com" ] } }
正确的用法
1个RequestBody
0个@RequestBody,多个无@RequestBody
1个@RequestBody,多个无@RequestBody
错误的用法(会报错)
多个@RequestBody
后端报错信息
2022-09-20 22:04:45.857 WARN 3340 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed]
错误原因
每个方法只能有一个@RequestBody。使用@RequestBody把请求转化为特定的Object(在最后会关闭相应的流),所以在同一个方法中第二次使用@RequestBody是没用的,因为流已经关闭。
You cannot use it this way as only one @RequestBody per method is allowed. Using @RequestBody Spring converts incoming request body into the specified object (what closes the stream representing body at the end) so attempting to use @RequestBody second time in the same method makes no sense as stream has been already closed.
不带@RequestBody参数类型是List
后端错误信息
2022-09-20 23:19:11.044 ERROR 3340 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
java.lang.NoSuchMethodException: java.util.List.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_201]
at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_201]
...(其他信息)
错误原因
不支持非@RequstBody的参数是List类型。(数组类型可以)。
到此这篇关于SpringBoot通过JSON传递请求参数的文章就介绍到这了,更多相关springboot传递请求参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- SpringBoot如何获取Get请求参数详解
- springBoot 过滤器去除请求参数前后空格实例详解
- springboot如何设置请求参数长度和文件大小限制
- SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解
- SpringBoot之自定义Filter获取请求参数与响应结果案例详解
- springboot vue接口测试HutoolUtil TreeUtil处理树形结构
- springboot vue接口测试前后端实现模块树列表功能
- springboot vue接口测试前后端树节点编辑删除功能
- springboot vue接口测试前端动态增删表单功能实现
- springboot3请求参数种类及接口测试案例小结