Springboot3?ResponseEntity?完全使用案例
Spring Boot 3 ResponseEntity 完全使用教程
在Springboot3 | 統(tǒng)一返回類設(shè)計(jì):從問(wèn)題到實(shí)現(xiàn)一文中,我們通過(guò)自定義設(shè)計(jì)實(shí)現(xiàn)了標(biāo)準(zhǔn)化響應(yīng)封裝類,該方案有效確保了RESTful接口響應(yīng)數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一性。值得關(guān)注的是,Spring Boot框架本身也提供了類似的標(biāo)準(zhǔn)化響應(yīng)機(jī)制實(shí)現(xiàn)方案。
ResponseEntity 是 Spring Boot 中控制 HTTP 響應(yīng)的核心工具——它能讓你精準(zhǔn)定義響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)體,相比直接返回實(shí)體類或字符串,靈活性和規(guī)范性提升一個(gè)量級(jí)。接下來(lái)我會(huì)用最易懂的方式,結(jié)合寵物(Pet)管理的實(shí)際場(chǎng)景,帶你掌握 ResponseEntity 的所有核心用法。
前置準(zhǔn)備
1. 項(xiàng)目基礎(chǔ)依賴(Maven)
首先確保你的 Spring Boot 3 項(xiàng)目引入了核心依賴(以 3.2.x 版本為例):
<dependencies>
<!-- Spring Boot Web 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok 簡(jiǎn)化實(shí)體類代碼 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 參數(shù)校驗(yàn)(用于后續(xù)異常場(chǎng)景) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>2. 核心實(shí)體類 Pet
補(bǔ)全 Pet 類(添加 Lombok 注解簡(jiǎn)化 getter/setter,參數(shù)校驗(yàn)注解用于后續(xù)案例):
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data // 自動(dòng)生成getter、setter、toString等方法
public class Pet {
private Long id; // 寵物ID(唯一標(biāo)識(shí))
@NotBlank(message = "寵物名稱不能為空")
private String name; // 寵物名稱
@NotBlank(message = "寵物品種不能為空")
private String breed; // 寵物品種(如"金毛"、"布偶貓")
@Min(value = 0, message = "寵物年齡不能為負(fù)數(shù)")
private Integer age; // 寵物年齡(單位:歲)
}3. 模擬數(shù)據(jù)層(簡(jiǎn)化案例,無(wú)需數(shù)據(jù)庫(kù))
創(chuàng)建一個(gè)簡(jiǎn)單的 PetService 模擬內(nèi)存數(shù)據(jù)操作,避免引入數(shù)據(jù)庫(kù)復(fù)雜度:
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class PetService {
// 模擬數(shù)據(jù)庫(kù)存儲(chǔ)寵物數(shù)據(jù)
private static final Map<Long, Pet> PET_MAP = new HashMap<>();
// 初始化測(cè)試數(shù)據(jù)
static {
PET_MAP.put(1L, new Pet(1L, "旺財(cái)", "金毛", 3));
PET_MAP.put(2L, new Pet(2L, "咪寶", "布偶貓", 2));
}
// 根據(jù)ID查詢寵物
public Pet getPetById(Long id) {
return PET_MAP.get(id);
}
// 新增寵物
public Pet addPet(Pet pet) {
long newId = PET_MAP.size() + 1;
pet.setId(newId);
PET_MAP.put(newId, pet);
return pet;
}
// 刪除寵物
public boolean deletePet(Long id) {
return PET_MAP.remove(id) != null;
}
}核心場(chǎng)景案例(結(jié)合ApiPost測(cè)試)
接下來(lái)的所有案例,都基于 PetController 實(shí)現(xiàn),每個(gè)場(chǎng)景對(duì)應(yīng)一個(gè)真實(shí)的 HTTP 業(yè)務(wù)場(chǎng)景,同時(shí)給出 ApiPost 測(cè)試步驟。
場(chǎng)景1:查詢單個(gè)寵物(成功返回200)
業(yè)務(wù)需求:根據(jù)寵物ID查詢?cè)斍?,存在則返回 200 OK + 寵物數(shù)據(jù)。
Controller 代碼:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pets")
public class PetController {
@Autowired
private PetService petService;
// 場(chǎng)景1:查詢單個(gè)寵物(成功返回200)
@GetMapping("/{id}")
public ResponseEntity<Pet> getPet(@PathVariable Long id) {
Pet pet = petService.getPetById(id);
// ResponseEntity.ok() 等價(jià)于 ResponseEntity.status(200).body(pet)
return ResponseEntity.ok(pet);
}
}ApiPost 測(cè)試步驟:
- 新建請(qǐng)求,請(qǐng)求方式選擇
GET,URL 填寫http://localhost:8080/pets/1; - 點(diǎn)擊「發(fā)送」,查看響應(yīng):
- 狀態(tài)碼:200 OK;
- 響應(yīng)體:
{
"id": 1,
"name": "旺財(cái)",
"breed": "金毛",
"age": 3
}場(chǎng)景2:新增寵物(成功返回201 + 自定義響應(yīng)頭)
業(yè)務(wù)需求:新增寵物成功后,返回 201 Created(符合 REST 規(guī)范),并在響應(yīng)頭中添加 Location(指向新增寵物的查詢地址)。
Controller 新增代碼:
// 場(chǎng)景2:新增寵物(返回201 + 自定義響應(yīng)頭)
@PostMapping
public ResponseEntity<Pet> addPet(@Valid @RequestBody Pet pet) {
Pet newPet = petService.addPet(pet);
// 構(gòu)建響應(yīng):狀態(tài)碼201 + Location響應(yīng)頭 + 新增寵物數(shù)據(jù)
return ResponseEntity
.status(201) // 等價(jià)于 ResponseEntity.created(URI.create("/pets/" + newPet.getId()))
.header("Location", "/pets/" + newPet.getId())
.body(newPet);
}ApiPost 測(cè)試步驟:
- 新建請(qǐng)求,請(qǐng)求方式選擇
POST,URL 填寫http://localhost:8080/pets; - 切換到「Body」標(biāo)簽,選擇「JSON」格式,輸入請(qǐng)求體:
{
"name": "小白",
"breed": "薩摩耶",
"age": 1
}- 點(diǎn)擊「發(fā)送」,查看響應(yīng):
- 狀態(tài)碼:201 Created;
- 響應(yīng)頭:包含
Location: /pets/3; - 響應(yīng)體:
{
"id": 3,
"name": "小白",
"breed": "薩摩耶",
"age": 1
}場(chǎng)景3:刪除寵物(成功返回204 無(wú)響應(yīng)體)
業(yè)務(wù)需求:刪除寵物成功后,返回 204 No Content(無(wú)響應(yīng)體,符合 REST 規(guī)范);刪除失敗則返回 404。
Controller 新增代碼:
// 場(chǎng)景3:刪除寵物(成功204,失敗404)
@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePet(@PathVariable Long id) {
boolean isDeleted = petService.deletePet(id);
if (isDeleted) {
// 204 無(wú)響應(yīng)體,使用 ResponseEntity.noContent().build()
return ResponseEntity.noContent().build();
} else {
// 404 未找到
return ResponseEntity.notFound().build();
}
}ApiPost 測(cè)試步驟:
- 新建請(qǐng)求,請(qǐng)求方式選擇
DELETE,URL 填寫http://localhost:8080/pets/3; - 點(diǎn)擊「發(fā)送」,查看響應(yīng):
- 狀態(tài)碼:204 No Content;
- 響應(yīng)體:為空(符合規(guī)范);
- 測(cè)試刪除不存在的寵物(URL 改為
http://localhost:8080/pets/99):- 狀態(tài)碼:404 Not Found。
場(chǎng)景4:查詢寵物不存在(返回404 + 錯(cuò)誤信息)
業(yè)務(wù)需求:查詢不存在的寵物時(shí),返回 404 Not Found + 自定義錯(cuò)誤提示(而非空響應(yīng))。
改造場(chǎng)景1的查詢接口:
// 場(chǎng)景4:改造查詢接口,不存在則返回404 + 錯(cuò)誤信息
@GetMapping("/{id}")
public ResponseEntity<Object> getPet(@PathVariable Long id) {
Pet pet = petService.getPetById(id);
if (pet != null) {
return ResponseEntity.ok(pet);
} else {
// 構(gòu)建自定義錯(cuò)誤響應(yīng)體,狀態(tài)碼404
Map<String, String> error = new HashMap<>();
error.put("code", "PET_NOT_FOUND");
error.put("message", "寵物ID:" + id + " 不存在");
return ResponseEntity.status(404).body(error);
}
}ApiPost 測(cè)試步驟:
- GET 請(qǐng)求 URL 填寫
http://localhost:8080/pets/99; - 點(diǎn)擊「發(fā)送」,查看響應(yīng):
- 狀態(tài)碼:404 Not Found;
- 響應(yīng)體:
{
"code": "PET_NOT_FOUND",
"message": "寵物ID:99 不存在"
}場(chǎng)景5:參數(shù)校驗(yàn)失?。ǚ祷?00 + 錯(cuò)誤信息)
業(yè)務(wù)需求:新增/修改寵物時(shí),參數(shù)不符合規(guī)則(如年齡負(fù)數(shù)、名稱為空),返回 400 Bad Request + 詳細(xì)錯(cuò)誤提示。
新增全局異常處理器(統(tǒng)一處理參數(shù)校驗(yàn)異常):
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice // 全局異常處理
public class GlobalExceptionHandler {
// 處理參數(shù)校驗(yàn)異常
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
// 遍歷所有校驗(yàn)失敗的字段,收集錯(cuò)誤信息
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
// 返回400 + 錯(cuò)誤信息
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
}
}ApiPost 測(cè)試步驟:
- POST 請(qǐng)求新增寵物,請(qǐng)求體傳入非法參數(shù):
{
"name": "",
"breed": "哈士奇",
"age": -1
}- 點(diǎn)擊「發(fā)送」,查看響應(yīng):
- 狀態(tài)碼:400 Bad Request;
- 響應(yīng)體:
{
"name": "寵物名稱不能為空",
"age": "寵物年齡不能為負(fù)數(shù)"
}前端測(cè)試
以下是極簡(jiǎn)版的 Axios 請(qǐng)求案例,僅聚焦「前端處理 ResponseEntity 返回內(nèi)容」的核心邏輯,所有結(jié)果直接輸出到瀏覽器控制臺(tái):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Axios 處理 ResponseEntity 示例</title>
<!-- 引入 Axios -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<button onclick="sendPetRequest()">發(fā)送新增寵物請(qǐng)求</button>
<script>
// 核心:發(fā)送POST請(qǐng)求并處理ResponseEntity返回內(nèi)容
async function sendPetRequest() {
try {
// 1. 構(gòu)造請(qǐng)求參數(shù)(與后端Pet實(shí)體匹配)
const petData = {
name: "小白",
breed: "薩摩耶",
age: 1
};
// 2. 發(fā)送POST請(qǐng)求,調(diào)用后端返回ResponseEntity的接口
const response = await axios.post(
'http://localhost:8080/pets', // 后端接口地址
petData // 請(qǐng)求體
);
// 3. 控制臺(tái)打印ResponseEntity的核心返回內(nèi)容(重點(diǎn)!)
console.log("===== ResponseEntity 返回內(nèi)容解析 =====");
console.log("1. HTTP狀態(tài)碼(ResponseEntity.status):", response.status); // 201
console.log("2. 響應(yīng)頭(ResponseEntity.header設(shè)置的內(nèi)容):", response.headers); // 含Location等
console.log("3. Location響應(yīng)頭具體值:", response.headers.location); // /pets/3
console.log("4. 響應(yīng)體(ResponseEntity.body):", response.data); // 新增的Pet對(duì)象
console.log("========================================");
} catch (error) {
// 4. 異常場(chǎng)景:解析錯(cuò)誤的ResponseEntity內(nèi)容
console.log("===== 錯(cuò)誤的ResponseEntity返回內(nèi)容 =====");
if (error.response) {
// 后端返回了錯(cuò)誤的ResponseEntity(如400/404)
console.log("錯(cuò)誤狀態(tài)碼:", error.response.status); // 400/404等
console.log("錯(cuò)誤響應(yīng)體:", error.response.data); // 后端返回的錯(cuò)誤信息
} else {
console.log("請(qǐng)求異常:", error.message); // 網(wǎng)絡(luò)/配置錯(cuò)誤
}
}
}
</script>
</body>
</html>核心說(shuō)明(聚焦 ResponseEntity 處理)
response.status:對(duì)應(yīng)后端ResponseEntity.status(201)設(shè)置的 HTTP 狀態(tài)碼;response.headers:對(duì)應(yīng)后端ResponseEntity.header("Location", ...)設(shè)置的響應(yīng)頭;response.data:對(duì)應(yīng)后端ResponseEntity.body(...)設(shè)置的響應(yīng)體(Pet 對(duì)象/錯(cuò)誤信息);- 錯(cuò)誤場(chǎng)景下,
error.response.status/error.response.data可獲取后端返回的錯(cuò)誤 ResponseEntity 內(nèi)容(如 400 時(shí)的參數(shù)錯(cuò)誤信息)。
測(cè)試步驟
- 啟動(dòng)后端 Spring Boot 項(xiàng)目;
- 用瀏覽器打開(kāi)該 HTML 文件,點(diǎn)擊按鈕;
- 按 F12 打開(kāi)控制臺(tái)(Console 標(biāo)簽),即可看到 ResponseEntity 各部分內(nèi)容的解析結(jié)果。
控制臺(tái)輸出示例(成功場(chǎng)景)
===== ResponseEntity 返回內(nèi)容解析 =====
1. HTTP狀態(tài)碼(ResponseEntity.status): 201
2. 響應(yīng)頭(ResponseEntity.header設(shè)置的內(nèi)容): {location: '/pets/3', ...}
3. Location響應(yīng)頭具體值: /pets/3
4. 響應(yīng)體(ResponseEntity.body): {id: 3, name: '小白', breed: '薩摩耶', age: 1}
========================================
控制臺(tái)輸出示例(錯(cuò)誤場(chǎng)景,如參數(shù)為空)
===== 錯(cuò)誤的ResponseEntity返回內(nèi)容 =====
錯(cuò)誤狀態(tài)碼: 400
錯(cuò)誤響應(yīng)體: {name: '寵物名稱不能為空', age: '寵物年齡不能為負(fù)數(shù)'}
核心總結(jié)
ResponseEntity 的核心價(jià)值是「完全掌控 HTTP 響應(yīng)」,記住這幾個(gè)關(guān)鍵用法:
- 快捷方法:
ok()(200)、created()(201)、noContent()(204)、notFound()(404)—— 日常開(kāi)發(fā)優(yōu)先用,代碼更簡(jiǎn)潔; - 自定義響應(yīng):
status(狀態(tài)碼)+header(鍵, 值)+body(響應(yīng)體)—— 滿足特殊業(yè)務(wù)需求; - 響應(yīng)體靈活:可以是實(shí)體類、Map、字符串,甚至 Void(204 場(chǎng)景);
- 結(jié)合異常處理:統(tǒng)一返回規(guī)范的錯(cuò)誤響應(yīng),提升接口友好性。
所有案例都能直接復(fù)制到項(xiàng)目中運(yùn)行,用 ApiPost 測(cè)試時(shí)只需注意端口和請(qǐng)求參數(shù),就能快速驗(yàn)證效果。掌握這些用法后,你的 Spring Boot 接口會(huì)更符合 REST 規(guī)范,也能應(yīng)對(duì)各種復(fù)雜的響應(yīng)需求。
ResponseEntity 的誕生與演進(jìn)
ResponseEntity 并非 Spring Boot 專屬特性,而是Spring Framework 中用于標(biāo)準(zhǔn)化 HTTP 響應(yīng)的核心類,其誕生和發(fā)展完全圍繞 Spring 對(duì) RESTful API 支持的演進(jìn)展開(kāi)。
1. 首次誕生:Spring Framework 3.0(2009年)
ResponseEntity 最早出現(xiàn)在 Spring Framework 3.0 版本(正式發(fā)布時(shí)間:2009年12月17日),是 Spring 為強(qiáng)化 RESTful API 開(kāi)發(fā)能力而新增的核心類。
誕生背景
- 2000年 Roy Fielding 提出 REST 架構(gòu)風(fēng)格后,2000年代后期 RESTful API 逐漸成為主流;
- Spring 2.x 及更早版本對(duì) HTTP 響應(yīng)的控制極為繁瑣(需手動(dòng)操作
HttpServletResponse設(shè)置狀態(tài)碼、響應(yīng)頭,或通過(guò)ModelAndView封裝結(jié)果),無(wú)法優(yōu)雅適配 REST 規(guī)范; - Spring 3.0 核心目標(biāo)之一是「原生支持 RESTful 開(kāi)發(fā)」,因此引入 ResponseEntity,將 HTTP 響應(yīng)的狀態(tài)碼、響應(yīng)頭、響應(yīng)體 封裝為統(tǒng)一對(duì)象,讓開(kāi)發(fā)者無(wú)需直接操作底層 Servlet API。
2. 關(guān)鍵演進(jìn)節(jié)點(diǎn)(與 Spring Boot 關(guān)聯(lián))
Spring Boot 是基于 Spring Framework 的封裝,其對(duì) ResponseEntity 的支持完全依賴底層 Spring 版本:
| 框架版本 | 關(guān)鍵變化 |
|---|---|
| Spring Framework 3.0 | 首次引入 ResponseEntity,核心能力:封裝狀態(tài)碼、響應(yīng)頭、響應(yīng)體 |
| Spring Framework 4.1 | 新增大量靜態(tài)工廠方法(如 ok()、notFound()、noContent()),簡(jiǎn)化使用 |
| Spring Framework 5.x | 適配響應(yīng)式編程(WebFlux),新增 ResponseEntity<T> 對(duì)響應(yīng)式類型的支持 |
| Spring Framework 6.x | 適配 Jakarta EE 9+(替代 Java EE),包路徑從 javax 遷移到 jakarta,但 ResponseEntity 核心邏輯不變 |
| Spring Boot 3.x | 基于 Spring Framework 6.x 構(gòu)建,沿用 ResponseEntity 所有特性,無(wú)額外修改 |
3. 核心定位未變
從 2009 年誕生至今,ResponseEntity 的核心設(shè)計(jì)目標(biāo)從未改變:
- 脫離底層 Servlet API 依賴,以面向?qū)ο蟮姆绞娇刂?HTTP 響應(yīng);
- 嚴(yán)格遵循 HTTP 規(guī)范,支持所有標(biāo)準(zhǔn)狀態(tài)碼(2xx/4xx/5xx)和自定義響應(yīng)頭;
- 保持靈活性,響應(yīng)體可適配任意類型(實(shí)體類、Map、字符串等)。
總結(jié)
- 「誕生時(shí)間」:2009年(Spring Framework 3.0);
- 「歸屬」:Spring Framework 的
spring-web模塊(非 Spring Boot 獨(dú)創(chuàng)); - 「Spring Boot 角色」:僅做集成和簡(jiǎn)化(如自動(dòng)配置、無(wú)需手動(dòng)注冊(cè) Bean),未改變 ResponseEntity 的核心實(shí)現(xiàn)。
你在 Spring Boot 3 中使用的 ResponseEntity,本質(zhì)是 Spring Framework 6.x 版本的實(shí)現(xiàn),相比 2009 年的初代版本,只是增加了更便捷的靜態(tài)方法和對(duì) Jakarta EE 的適配,核心能力和設(shè)計(jì)初衷完全一致。
到此這篇關(guān)于Springboot3 ResponseEntity 完全使用案例的文章就介紹到這了,更多相關(guān)Springboot ResponseEntity使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中ResponseEntity的使用方法舉例詳解
- 一文詳解Spring中ResponseEntity包裝器的使用
- SpringBoot的ResponseEntity類返回給前端具體講解
- SpringBoot ResponseEntity標(biāo)識(shí)Http響應(yīng)方式
- 解決springboot responseentity<string>亂碼問(wèn)題
- springmvc @ResponseStatus和ResponseEntity的使用
- SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載
- 使用spring框架ResponseEntity實(shí)現(xiàn)文件下載
- Spring ResponseEntity的使用詳解
相關(guān)文章
SpringBoot如何通過(guò)配置禁用swagger
這篇文章主要給大家介紹了關(guān)于SpringBoot如何通過(guò)配置禁用swagger的相關(guān)資料,Swagger用來(lái)在開(kāi)發(fā)階段方便前后端分離的項(xiàng)目實(shí)戰(zhàn)中,提高前后端人員的工作效率,降低交流成本,但是版本上線之后要是把Swagger帶上去會(huì)存在很大的風(fēng)險(xiǎn),需要的朋友可以參考下2023-08-08
IDE Eval Reset忘了重置進(jìn)不去的完美解決方法
這篇文章主要介紹了IDE Eval Reset忘了重置進(jìn)不去的完美解決方法,插件安裝方式包括離線安裝和在線安裝方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
論Java Web應(yīng)用中調(diào)優(yōu)線程池的重要性
這篇文章主要論述Java Web應(yīng)用中調(diào)優(yōu)線程池的重要性,通過(guò)了解應(yīng)用的需求,組合最大線程數(shù)和平均響應(yīng)時(shí)間,得出一個(gè)合適的線程池配置2016-04-04
SpringBoot中公共字段自動(dòng)填充的常用技巧
這篇文章主要為大家詳細(xì)介紹了SpringBoot中公共字段自動(dòng)填充的幾個(gè)常用技巧,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
SpringBoot 簽到獎(jiǎng)勵(lì)實(shí)現(xiàn)方案的示例代碼
這篇文章主要介紹了SpringBoot 簽到獎(jiǎng)勵(lì)實(shí)現(xiàn)方案的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
基于SpringBoot上傳任意文件功能的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇基于SpringBoot上傳任意文件功能的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08

