欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中@RestController和@Controller的使用及區(qū)別

 更新時(shí)間:2025年03月22日 10:20:18   作者:HinINAX  
這篇文章主要介紹了Spring中@RestController和@Controller的使用及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring中@RestController和@Controller使用及區(qū)別

@RestControllerSpring Web 提供的一個(gè)用來(lái)開發(fā) RESTful Web 服務(wù)的關(guān)鍵注解,它是 @Controller@ResponseBody 的組合注解。通過(guò) @RestController,我們可以實(shí)現(xiàn)處理 HTTP 請(qǐng)求并直接返回 JSON、XML 或其他格式的數(shù)據(jù),而不是返回視圖頁(yè)面。

以下是對(duì) @RestController 注解的詳細(xì)解析:

1. 基本定義

@RestController 的作用

  • 它是一個(gè) 標(biāo)記類 的注解,標(biāo)識(shí)該類是一個(gè) Spring MVC 控制器,且所有方法的返回值會(huì)直接作為 HTTP 響應(yīng)體(Response Body)。
  • 可以用來(lái)簡(jiǎn)化 RESTful API 的開發(fā)。

注解的來(lái)源

@RestController 是 Spring 4.0 引入的,屬于 org.springframework.web.bind.annotation 包。

組合關(guān)系

它相當(dāng)于 @Controller@ResponseBody 的組合:

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}

@Controller

  • 標(biāo)識(shí)當(dāng)前類是一個(gè) Spring MVC 控制器,用于處理 HTTP 請(qǐng)求。

@ResponseBody

  • 方法的返回值不會(huì)被解析為視圖名稱,而是直接寫入 HTTP 響應(yīng)體中。

2. 使用場(chǎng)景

@RestController 一般用于開發(fā) RESTful 風(fēng)格的服務(wù)接口,如前后端分離的項(xiàng)目中,前端通過(guò) AJAX 或其他 Http 客戶端調(diào)用后端接口,獲取 JSON 或 XML 數(shù)據(jù)。

@Controller 的區(qū)別在于:

  • @RestController 專注于返回?cái)?shù)據(jù)(如 JSON、XML)。
  • @Controller 通常用于返回視圖頁(yè)面(如 HTML、JSP)。

3. 使用示例

示例 1:創(chuàng)建一個(gè)簡(jiǎn)單的 RESTful API

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {

    // GET 請(qǐng)求,獲取用戶信息
    @GetMapping("/{id}")
    public String getUserById(@PathVariable("id") Long id) {
        return "User ID: " + id;
    }

    // POST 請(qǐng)求,創(chuàng)建新用戶
    @PostMapping
    public String createUser(@RequestBody String user) {
        return "User created: " + user;
    }
}

請(qǐng)求說(shuō)明

  1. @RestController 標(biāo)注了 UserController 這個(gè)類是 RESTful 控制器。
  2. 返回值直接寫入響應(yīng)體,不需要額外使用 @ResponseBody。
  3. 示例中實(shí)現(xiàn)了兩個(gè)接口:
    • 獲取用戶信息(GET /api/users/{id})。
    • 創(chuàng)建用戶(POST /api/users)。

4. 與 @Controller 的對(duì)比

特性@RestController@Controller
主要用途處理 RESTful Web 服務(wù)請(qǐng)求,返回 JSON 或 XML返回視圖頁(yè)面(如 Thymeleaf、JSP 等)。
是否需要使用 @ResponseBody不需要,默認(rèn)應(yīng)用于所有方法返回值。需要單獨(dú)為每個(gè)方法標(biāo)注 @ResponseBody。
返回內(nèi)容數(shù)據(jù)(JSON、XML、文本等)。視圖名稱(如 Html 文件)。
使用場(chǎng)景前后端分離的項(xiàng)目。傳統(tǒng) Web 應(yīng)用(如返回 HTML 頁(yè)面)。

示例對(duì)比:

@RestController 示例

@RestController
@RequestMapping("/api")
public class ApiController {
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello, World!";
    }
}

返回結(jié)果:Hello, World! 作為純文本響應(yīng)。

@Controller 示例

@Controller
@RequestMapping("/web")
public class WebController {
    @GetMapping("/greeting")
    public String greeting() {
        return "greeting"; // 返回視圖名稱
    }
}

返回結(jié)果:渲染名為 greeting.html 的視圖。

5. 常用注解配合使用

5.1 配合 @RequestMapping

@RequestMapping 用于指定類或方法的請(qǐng)求路徑??梢耘c @RestController 配合使用,設(shè)置 RESTful API 的基礎(chǔ)路徑。

示例:

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, API!";
    }
}

請(qǐng)求路徑:GET /api/hello

5.2 配合 @GetMapping、@PostMapping

  • @GetMapping:用于處理 HTTP GET 請(qǐng)求。
  • @PostMapping:用于處理 HTTP POST 請(qǐng)求。

示例:

@RestController
@RequestMapping("/users")
public class UserController {

    // GET 請(qǐng)求
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        return "User ID: " + id;
    }

    // POST 請(qǐng)求
    @PostMapping
    public String createUser(@RequestBody String user) {
        return "Created User: " + user;
    }
}

5.3 配合 @RequestBody

@RequestBody 將 JSON 請(qǐng)求體轉(zhuǎn)換為 Java 對(duì)象。

示例:

@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
}

請(qǐng)求數(shù)據(jù):

{
    "title": "Spring in Action",
    "author": "Craig Walls"
}

5.4 配合 @PathVariable@RequestParam

  • @PathVariable:從請(qǐng)求路徑中獲取變量。
  • @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;
    }
}
  • 請(qǐng)求路徑:GET /products/123?name=Phone
  • 返回結(jié)果:Product ID: 123, Name: Phone

6. 返回 JSON 數(shù)據(jù)

@RestController 默認(rèn)將返回值序列化為 JSON 格式(如果依賴的 Jackson 庫(kù)存在)。

示例:

@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
}

返回結(jié)果:

{
    "id": 1,
    "name": "John"
}

7. 常見問(wèn)題

7.1 返回值無(wú)法序列化

  • 如果返回的對(duì)象沒(méi)有提供 getter 或沒(méi)有無(wú)參構(gòu)造函數(shù),可能導(dǎo)致 JSON 序列化失敗。
  • 解決方法:確保返回的對(duì)象有正確的 getter 和無(wú)參構(gòu)造器。

7.2 404 Not Found 錯(cuò)誤

  • 檢查請(qǐng)求路徑是否正確。
  • 確??刂破黝惡头椒ǖ?@RequestMapping 路徑匹配。

7.3 415 Unsupported Media Type 問(wèn)題

  • 如果使用 @RequestBody,確保請(qǐng)求頭中有 Content-Type: application/json

8. 特性總結(jié)

特性描述
組合注解是 @Controller 和 @ResponseBody 的組合。
返回?cái)?shù)據(jù)格式默認(rèn)返回 JSON 數(shù)據(jù)(需要依賴 Jackson 庫(kù))。
適用場(chǎng)景RESTful API 開發(fā),前后端分離項(xiàng)目接口開發(fā)。
簡(jiǎn)化開發(fā)不需要額外為每個(gè)方法添加 @ResponseBody。

總結(jié)

  • @RestController 是 Spring Web 提供的一個(gè)便捷注解,專用于處理 RESTful API 請(qǐng)求。
  • 它簡(jiǎn)化了傳統(tǒng)的 @Controller + @ResponseBody 的開發(fā)方式。
  • 配合其他注解(如 @RequestMapping、@GetMapping@RequestBody 等)可以快速開發(fā)健壯的 RESTful 服務(wù)。
  • 在前后端分離的應(yīng)用中,@RestController 是必不可少的工具之一。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java深入講解AWT實(shí)現(xiàn)事件處理流程

    Java深入講解AWT實(shí)現(xiàn)事件處理流程

    AWT的事件處理是一種委派式事件處理方式:普通組件(事件源)將整個(gè)事件處理委托給特定的對(duì)象(事件監(jiān)聽器);當(dāng)該事件源發(fā)生指定的事件時(shí),就通知所委托的事件監(jiān)聽器,由事件監(jiān)聽器來(lái)處理這個(gè)事件
    2022-04-04
  • Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案

    這篇文章主要介紹了Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案,分布式部署hadoop,服務(wù)機(jī)只有namenode節(jié)點(diǎn),主機(jī)包含其他所有節(jié)點(diǎn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • java后臺(tái)啟動(dòng)jar包的一些命令匯總

    java后臺(tái)啟動(dòng)jar包的一些命令匯總

    這篇文章主要介紹了java后臺(tái)啟動(dòng)jar包的一些命令匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-03-03
  • IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程)

    IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程)

    這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程),需要的朋友可以參考下
    2021-04-04
  • SpringBoot結(jié)合Redis實(shí)現(xiàn)接口冪等性的示例代碼

    SpringBoot結(jié)合Redis實(shí)現(xiàn)接口冪等性的示例代碼

    本文主要介紹了SpringBoot結(jié)合Redis實(shí)現(xiàn)接口冪等性的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • SpringBoot內(nèi)置tomcat啟動(dòng)原理詳解

    SpringBoot內(nèi)置tomcat啟動(dòng)原理詳解

    這篇文章主要介紹了SpringBoot內(nèi)置tomcat啟動(dòng)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明

    Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明

    這篇文章主要介紹了Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java8 Instant 時(shí)間及轉(zhuǎn)換操作

    java8 Instant 時(shí)間及轉(zhuǎn)換操作

    這篇文章主要介紹了java8 Instant 時(shí)間及轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • springboot2.x引入feign踩的坑及解決

    springboot2.x引入feign踩的坑及解決

    這篇文章主要介紹了springboot2.x引入feign踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java11?中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化問(wèn)題

    Java11?中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化問(wèn)題

    在?Java?語(yǔ)言中,類和接口可以相互嵌套,這種組合之間可以不受限制的彼此訪問(wèn),包括訪問(wèn)彼此的構(gòu)造函數(shù)、字段、方法,接下來(lái)通過(guò)本文給大家介紹Java11中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化問(wèn)題,感興趣的朋友一起看看吧
    2022-01-01

最新評(píng)論