SpringBoot--通过JSON传递请求参数--方法/实例
创始人
2024-02-09 15:52:23
0

原文网址:SpringBoot--通过JSON传递请求参数--方法/实例_IT利刃出鞘的博客-CSDN博客

简介

        本文用示例介绍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 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 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 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 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 causejava.lang.NoSuchMethodException: java.util.List.()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类型。(数组类型可以)。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...