SpringBoot通過JSON傳遞請求參數的實例詳解
簡介
本文用示例介紹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傳遞請求參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot如何獲取Get請求參數詳解
- springBoot 過濾器去除請求參數前后空格實例詳解
- springboot如何設置請求參數長度和文件大小限制
- SpringBoot常見get/post請求參數處理、參數注解校驗及參數自定義注解校驗詳解
- SpringBoot之自定義Filter獲取請求參數與響應結果案例詳解
- springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結構
- springboot?vue接口測試前后端實現模塊樹列表功能
- springboot?vue接口測試前后端樹節(jié)點編輯刪除功能
- springboot?vue接口測試前端動態(tài)增刪表單功能實現
- springboot3請求參數種類及接口測試案例小結
相關文章
解決Error:(5, 28) java: 程序包org.apache.ibatis.io
這篇文章主要介紹了解決Error:(5, 28) java: 程序包org.apache.ibatis.io不存在問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot POST請求接收多個參數值為null問題
SpringBoot接口中POST請求接收JSON數據時,使用簡單類型接收會報null,需要封裝成實體類或使用Map(并注明泛型)接收,并且使用@RequestBody注解2025-02-02
SpringBoot+Hutool+thymeleaf完成導出Excel的實現方法
這篇文章主要介紹了SpringBoot+Hutool+thymeleaf完成導出Excel,本篇示例當中不僅僅有后端,而且還提供了前端html,html當中利用js將后端 輸出流直接下載為文件,需要的朋友可以參考下2022-03-03

