Spring MVC處理HTTP狀態(tài)碼、響應(yīng)頭和異常的完整示例
Spring MVC 處理 HTTP 狀態(tài)碼、響應(yīng)頭和異常的完整示例
1. 正常響應(yīng)處理
通過(guò) ResponseEntity 可以靈活控制 HTTP 狀態(tài)碼、響應(yīng)頭和響應(yīng)體。
代碼示例:創(chuàng)建資源返回 201 并設(shè)置 Location 頭
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 保存用戶邏輯(假設(shè)已成功保存)
user.setId(1L); // 假設(shè)生成的用戶ID為1
// 設(shè)置 Location 頭指向新資源的 URI
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(user.getId())
.toUri());
return new ResponseEntity<>(user, headers, HttpStatus.CREATED); // 201 Created
}
}
代碼示例:成功響應(yīng)返回 200 并設(shè)置 Cache-Control 頭
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id); // 假設(shè)用戶存在
HttpHeaders headers = new HttpHeaders();
headers.setCacheControl(CacheControl.noCache()); // 禁止緩存
return new ResponseEntity<>(user, headers, HttpStatus.OK); // 200 OK
}
2. 異常處理
通過(guò) @ResponseStatus 和 @ControllerAdvice 實(shí)現(xiàn)異常狀態(tài)碼與響應(yīng)控制。
自定義異常類(帶 @ResponseStatus)
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "User not found")
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
全局異常處理類(@ControllerAdvice)
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorDetails> handleUserNotFound(
UserNotFoundException ex, WebRequest request) {
ErrorDetails error = new ErrorDetails(
HttpStatus.NOT_FOUND.value(),
ex.getMessage(),
request.getDescription(false)
);
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorDetails> handleGeneralException(
Exception ex, WebRequest request) {
ErrorDetails error = new ErrorDetails(
HttpStatus.INTERNAL_SERVER_ERROR.value(),
"Internal Server Error",
request.getDescription(false)
);
return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
// 輔助類:錯(cuò)誤響應(yīng)體
private static class ErrorDetails {
private int statusCode;
private String message;
private String path;
public ErrorDetails(int statusCode, String message, String path) {
this.statusCode = statusCode;
this.message = message;
this.path = path;
}
// 省略 getter/setter
}
}
3. 響應(yīng)頭設(shè)置示例
@GetMapping("/custom-headers")
public ResponseEntity<String> customHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Custom-Header", "custom-value");
headers.set("Content-Type", "text/plain");
headers.set("Access-Control-Allow-Origin", "*");
return new ResponseEntity<>("Response with custom headers", headers, HttpStatus.OK);
}
4. 關(guān)鍵注解與類說(shuō)明
| 注解/類 | 作用 | 示例 |
|---|---|---|
| @ResponseStatus | 在異常類上定義默認(rèn) HTTP 狀態(tài)碼和原因。 | @ResponseStatus(HttpStatus.NOT_FOUND) |
| ResponseEntity | 直接控制 HTTP 狀態(tài)碼、響應(yīng)頭和響應(yīng)體。 | new ResponseEntity<>(data, headers, HttpStatus.OK) |
| @ControllerAdvice | 全局異常處理類,集中管理異常響應(yīng)。 | @ControllerAdvice + @ExceptionHandler |
| HttpStatus | HTTP 狀態(tài)碼枚舉(如 HttpStatus.OK, HttpStatus.CREATED)。 | HttpStatus.NOT_FOUND |
5. 場(chǎng)景總結(jié)表格
| 場(chǎng)景 | 實(shí)現(xiàn)方式 | 狀態(tài)碼 | 響應(yīng)頭示例 | 適用情況 |
|---|---|---|---|---|
| 成功創(chuàng)建資源 | ResponseEntity + HttpStatus.CREATED | 201 | Location: /api/users/1 | 新資源創(chuàng)建成功后返回位置 |
| 返回成功數(shù)據(jù) | ResponseEntity + HttpStatus.OK | 200 | Cache-Control: no-cache | 正常業(yè)務(wù)響應(yīng) |
| 資源不存在異常 | @ResponseStatus(HttpStatus.NOT_FOUND) | 404 | 無(wú) | 資源查詢失敗 |
| 全局異常處理(如服務(wù)器錯(cuò)誤) | @ControllerAdvice + @ExceptionHandler | 500 | 無(wú) | 捕獲通用未處理異常 |
| 自定義響應(yīng)頭 | ResponseEntity 設(shè)置 HttpHeaders | 200 | X-Custom-Header: custom-value | 需要添加自定義響應(yīng)頭時(shí) |
關(guān)鍵總結(jié)
- 狀態(tài)碼控制:
ResponseEntity直接指定狀態(tài)碼(如HttpStatus.CREATED)。@ResponseStatus在異常類上定義默認(rèn)狀態(tài)碼。
- 響應(yīng)頭管理:
- 通過(guò)
HttpHeaders對(duì)象添加任意頭信息。
- 通過(guò)
- 異常處理:
- 自定義異常 +
@ResponseStatus:針對(duì)特定異常返回狀態(tài)碼。 @ControllerAdvice:全局統(tǒng)一處理異常,返回結(jié)構(gòu)化錯(cuò)誤信息。
- 自定義異常 +
- 最佳實(shí)踐:
- 使用
ResponseEntity精確控制響應(yīng)細(xì)節(jié)。 - 通過(guò)
ErrorDetails統(tǒng)一錯(cuò)誤響應(yīng)格式。 - 對(duì)于常見(jiàn) HTTP 狀態(tài)碼(如 404、500),優(yōu)先使用標(biāo)準(zhǔn)枚舉值。
- 使用
以上就是Spring MVC處理HTTP狀態(tài)碼、響應(yīng)頭和異常的完整示例的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC處理HTTP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Feign?日期格式轉(zhuǎn)換錯(cuò)誤的問(wèn)題
這篇文章主要介紹了Feign?日期格式轉(zhuǎn)換錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Mybatis-plus原生pages分頁(yè)未生效的解決方案
本文主要介紹了Mybatis-plus原生pages分頁(yè)未生效的解決方案,包含介紹了未生效的5種原因以及解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
java生成圖片驗(yàn)證碼返回base64圖片信息方式
這篇文章主要介紹了java生成圖片驗(yàn)證碼返回base64圖片信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
JAVAEE項(xiàng)目結(jié)構(gòu)以及并發(fā)隨想
每個(gè)代碼里面的工具都是工具,API是你最需要理解的,哪個(gè)好,哪個(gè)不好,沒(méi)有準(zhǔn)確答案。 一切皆對(duì)象,對(duì)于Java來(lái)講是純粹的,代理是對(duì)象,反射是對(duì)象,對(duì)象是對(duì)象,基本數(shù)據(jù)類型不是對(duì)象。2016-04-04
在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化
這篇文章主要介紹了在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化的方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01
Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼
這篇文章主要介紹了Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼,需要的朋友可以參考下2018-11-11

