Spring中@RestController和@Controller的使用及區(qū)別
Spring中@RestController和@Controller使用及區(qū)別
@RestController 是 Spring Web 提供的一個用來開發(fā) RESTful Web 服務的關鍵注解,它是 @Controller 和 @ResponseBody 的組合注解。通過 @RestController,我們可以實現(xiàn)處理 HTTP 請求并直接返回 JSON、XML 或其他格式的數(shù)據(jù),而不是返回視圖頁面。
以下是對 @RestController 注解的詳細解析:
1. 基本定義
@RestController 的作用
- 它是一個 標記類 的注解,標識該類是一個 Spring MVC 控制器,且所有方法的返回值會直接作為 HTTP 響應體(Response Body)。
- 可以用來簡化 RESTful API 的開發(fā)。
注解的來源
@RestController 是 Spring 4.0 引入的,屬于 org.springframework.web.bind.annotation 包。
組合關系
它相當于 @Controller 和 @ResponseBody 的組合:
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}@Controller:
- 標識當前類是一個 Spring MVC 控制器,用于處理 HTTP 請求。
@ResponseBody:
- 方法的返回值不會被解析為視圖名稱,而是直接寫入 HTTP 響應體中。
2. 使用場景
@RestController 一般用于開發(fā) RESTful 風格的服務接口,如前后端分離的項目中,前端通過 AJAX 或其他 Http 客戶端調用后端接口,獲取 JSON 或 XML 數(shù)據(jù)。
與 @Controller 的區(qū)別在于:
@RestController專注于返回數(shù)據(jù)(如 JSON、XML)。@Controller通常用于返回視圖頁面(如 HTML、JSP)。
3. 使用示例
示例 1:創(chuàng)建一個簡單的 RESTful API
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserController {
// GET 請求,獲取用戶信息
@GetMapping("/{id}")
public String getUserById(@PathVariable("id") Long id) {
return "User ID: " + id;
}
// POST 請求,創(chuàng)建新用戶
@PostMapping
public String createUser(@RequestBody String user) {
return "User created: " + user;
}
}請求說明:
@RestController標注了UserController這個類是 RESTful 控制器。- 返回值直接寫入響應體,不需要額外使用
@ResponseBody。 - 示例中實現(xiàn)了兩個接口:
- 獲取用戶信息(
GET /api/users/{id})。 - 創(chuàng)建用戶(
POST /api/users)。
- 獲取用戶信息(
4. 與 @Controller 的對比
| 特性 | @RestController | @Controller |
|---|---|---|
| 主要用途 | 處理 RESTful Web 服務請求,返回 JSON 或 XML | 返回視圖頁面(如 Thymeleaf、JSP 等)。 |
| 是否需要使用 @ResponseBody | 不需要,默認應用于所有方法返回值。 | 需要單獨為每個方法標注 @ResponseBody。 |
| 返回內容 | 數(shù)據(jù)(JSON、XML、文本等)。 | 視圖名稱(如 Html 文件)。 |
| 使用場景 | 前后端分離的項目。 | 傳統(tǒng) Web 應用(如返回 HTML 頁面)。 |
示例對比:
@RestController 示例:
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, World!";
}
}返回結果:Hello, World! 作為純文本響應。
@Controller 示例:
@Controller
@RequestMapping("/web")
public class WebController {
@GetMapping("/greeting")
public String greeting() {
return "greeting"; // 返回視圖名稱
}
}返回結果:渲染名為 greeting.html 的視圖。
5. 常用注解配合使用
5.1 配合 @RequestMapping
@RequestMapping 用于指定類或方法的請求路徑??梢耘c @RestController 配合使用,設置 RESTful API 的基礎路徑。
示例:
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, API!";
}
}請求路徑:GET /api/hello
5.2 配合 @GetMapping、@PostMapping
@GetMapping:用于處理 HTTP GET 請求。@PostMapping:用于處理 HTTP POST 請求。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
// GET 請求
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
return "User ID: " + id;
}
// POST 請求
@PostMapping
public String createUser(@RequestBody String user) {
return "Created User: " + user;
}
}5.3 配合 @RequestBody
@RequestBody 將 JSON 請求體轉換為 Java 對象。
示例:
@RestController
@RequestMapping("/books")
public class BookController {
@PostMapping
public String createBook(@RequestBody Book book) {
return "Created Book: " + book.getTitle();
}
}
class Book {
private String title;
private String author;
// Getter and Setter
}請求數(shù)據(jù):
{
"title": "Spring in Action",
"author": "Craig Walls"
}5.4 配合 @PathVariable 和 @RequestParam
@PathVariable:從請求路徑中獲取變量。@RequestParam:從查詢參數(shù)中獲取值。
示例:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/{id}")
public String getProduct(@PathVariable Long id, @RequestParam String name) {
return "Product ID: " + id + ", Name: " + name;
}
}- 請求路徑:
GET /products/123?name=Phone - 返回結果:
Product ID: 123, Name: Phone
6. 返回 JSON 數(shù)據(jù)
@RestController 默認將返回值序列化為 JSON 格式(如果依賴的 Jackson 庫存在)。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return new User(id, "John");
}
}
class User {
private Long id;
private String name;
// Constructor, Getter, Setter
}返回結果:
{
"id": 1,
"name": "John"
}7. 常見問題
7.1 返回值無法序列化
- 如果返回的對象沒有提供
getter或沒有無參構造函數(shù),可能導致 JSON 序列化失敗。 - 解決方法:確保返回的對象有正確的
getter和無參構造器。
7.2 404 Not Found 錯誤
- 檢查請求路徑是否正確。
- 確??刂破黝惡头椒ǖ?
@RequestMapping路徑匹配。
7.3 415 Unsupported Media Type 問題
- 如果使用
@RequestBody,確保請求頭中有Content-Type: application/json。
8. 特性總結
| 特性 | 描述 |
|---|---|
| 組合注解 | 是 @Controller 和 @ResponseBody 的組合。 |
| 返回數(shù)據(jù)格式 | 默認返回 JSON 數(shù)據(jù)(需要依賴 Jackson 庫)。 |
| 適用場景 | RESTful API 開發(fā),前后端分離項目接口開發(fā)。 |
| 簡化開發(fā) | 不需要額外為每個方法添加 @ResponseBody。 |
總結
@RestController是 Spring Web 提供的一個便捷注解,專用于處理 RESTful API 請求。- 它簡化了傳統(tǒng)的
@Controller+@ResponseBody的開發(fā)方式。 - 配合其他注解(如
@RequestMapping、@GetMapping、@RequestBody等)可以快速開發(fā)健壯的 RESTful 服務。 - 在前后端分離的應用中,
@RestController是必不可少的工具之一。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案
這篇文章主要介紹了Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案,分布式部署hadoop,服務機只有namenode節(jié)點,主機包含其他所有節(jié)點,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-10-10
IntelliJ IDEA2021.1 配置大全(超詳細教程)
這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細教程),需要的朋友可以參考下2021-04-04
SpringBoot結合Redis實現(xiàn)接口冪等性的示例代碼
本文主要介紹了SpringBoot結合Redis實現(xiàn)接口冪等性的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
Mybatis的mapper.xml中if標簽test判斷的用法說明
這篇文章主要介紹了Mybatis的mapper.xml中if標簽test判斷的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

