最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC返回JSON視圖的六種方式及對(duì)比詳解

 更新時(shí)間:2025年08月21日 10:43:07   作者:愛的嘆息  
在 Spring MVC 中返回 JSON 格式的數(shù)據(jù)是一種常見的需求,特別是在構(gòu)建 RESTful Web 服務(wù)時(shí),可以通過以下幾種方式實(shí)現(xiàn)控制器方法返回 JSON 數(shù)據(jù),需要的朋友可以參考下

1. 方式一:@ResponseBody 注解

作用:直接返回對(duì)象,由消息轉(zhuǎn)換器(如 Jackson)序列化為 JSON。

適用場景:簡單返回對(duì)象,無需自定義 HTTP 狀態(tài)碼或頭信息。

代碼示例

@Controller
public class UserController {
    @GetMapping("/user/json")
    @ResponseBody
    public User getUser() {
        return new User("John", 30); // 自動(dòng)序列化為 JSON
    }
}

依賴:需引入 Jackson 庫(Spring Boot 默認(rèn)已集成)。

特點(diǎn)

  • 簡單直接,但需顯式標(biāo)注 @ResponseBody。
  • 無法直接控制 HTTP 狀態(tài)碼或頭信息。

2. 方式二:@RestController 注解

作用:組合 @Controller@ResponseBody,所有方法默認(rèn)返回 JSON。

適用場景:RESTful API 控制器,所有方法均返回 JSON。

代碼示例

@RestController
public class UserController {
    @GetMapping("/user/json")
    public User getUser() {
        return new User("John", 30); // 無需 @ResponseBody
    }
}

依賴:同 @ResponseBody

特點(diǎn)

  • 簡化配置,類級(jí)別標(biāo)注即可。
  • 所有方法默認(rèn)返回 JSON,適合 REST API。

3. 方式三:ResponseEntity 對(duì)象

作用:返回包裝對(duì)象,可自定義 HTTP 狀態(tài)碼、頭信息和響應(yīng)體。

適用場景:需要返回特定狀態(tài)碼(如 404、201)或自定義頭信息。

代碼示例

@RestController
public class UserController {
    @GetMapping("/user/json")
    public ResponseEntity<User> getUser() {
        User user = new User("John", 30);
        return ResponseEntity
            .status(HttpStatus.CREATED)
            .header("X-Custom-Header", "value")
            .body(user);
    }
}

依賴:無需額外依賴。

特點(diǎn)

  • 靈活性高,可控制狀態(tài)碼、頭和響應(yīng)體。
  • 適合復(fù)雜響應(yīng)場景。

4. 方式四:@JsonView 控制序列化字段

作用:通過注解控制對(duì)象序列化的字段,避免暴露敏感數(shù)據(jù)。

適用場景:需要根據(jù)場景選擇性序列化字段(如不同 API 版本)。

代碼示例

// 定義視圖類
class Views {
    static class Public {} 
    static class Internal extends Public {}
}

@RestController
public class UserController {
    @JsonView(Views.Public.class)
    @GetMapping("/user/json/public")
    public User getPublicUser() {
        return new User("John", 30); // 只序列化 @JsonView(Views.Public) 的字段
    }

    @JsonView(Views.Internal.class)
    @GetMapping("/user/json/internal")
    public User getInternalUser() {
        return new User("John", 30); // 序列化 Public 和 Internal 的字段
    }
}

// User 類字段配置
public class User {
    @JsonView(Views.Public.class)
    private String name;
    
    @JsonView(Views.Internal.class)
    private int age;
    // ...
}

依賴:Jackson 的 @JsonView 注解。

特點(diǎn)

  • 精細(xì)控制序列化字段。
  • 適合不同接口 暴露不同數(shù)據(jù)。

5. 方式五:@RequestBody 反序列化 + @ResponseBody 序列化

作用:處理 POST/PUT 請(qǐng)求的 JSON 反序列化,同時(shí)返回 JSON。

適用場景:需要雙向 JSON 交互(如 REST API)。

代碼示例

@RestController
public class UserController {
    @PostMapping("/user/save")
    public User saveUser(@RequestBody User user) {
        // 反序列化 JSON 請(qǐng)求體到 User 對(duì)象
        return user; // 序列化為 JSON 響應(yīng)
    }
}

依賴:Jackson。

特點(diǎn)

  • 支持請(qǐng)求體反序列化和響應(yīng)體序列化。
  • 適合 RESTful CRUD 操作。

6. 新增方式六:MappingJackson2JsonView

作用:通過視圖解析器將模型數(shù)據(jù)轉(zhuǎn)換為 JSON 格式的視圖。

適用場景:需要兼容舊代碼或特定視圖配置(如傳統(tǒng)基于視圖的 MVC 流程)。

代碼示例

@Controller
public class UserController {
    @GetMapping("/user/json")
    public String getUser(Model model) {
        User user = new User("John", 30);
        model.addAttribute("user", user); // 將數(shù)據(jù)存入模型
        return "jsonView"; // 視圖名稱
    }
}

視圖配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public View jsonView() {
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        view.setExtractValueFromSingleKeyModel(true); // 自動(dòng)提取模型中的值
        return view;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(); // 啟用內(nèi)容協(xié)商
        registry.viewResolver((s, locale) -> jsonView());
    }
}

依賴:需引入 org.springframework:spring-webmvc 和 Jackson。

特點(diǎn)

  • 傳統(tǒng)視圖方式:依賴視圖解析器和模型數(shù)據(jù),流程與 JSP 等視圖一致。
  • 配置復(fù)雜:需手動(dòng)配置視圖和視圖解析器。
  • 靈活性低:無法直接控制 HTTP 狀態(tài)碼或頭信息。
  • 適用場景:在需要與傳統(tǒng)視圖(如 JSP)共存時(shí)使用。

對(duì)比表格(新增 MappingJackson2JsonView)

方式適用場景控制能力代碼復(fù)雜度依賴是否需要視圖解析器
@ResponseBody簡單返回對(duì)象僅返回?cái)?shù)據(jù),無狀態(tài)/頭控制Jackson
@RestControllerREST API 控制器同 @ResponseBody,簡化配置Jackson
ResponseEntity需要自定義狀態(tài)碼/頭信息狀態(tài)碼、頭、數(shù)據(jù)全控制無額外依賴
@JsonView需要控制序列化字段粒度控制字段序列化Jackson 的 @JsonView
@RequestBody + @ResponseBody雙向 JSON 交互(如 POST/PUT)反序列化請(qǐng)求體,序列化響應(yīng)體Jackson
MappingJackson2JsonView兼容舊代碼或特定視圖配置僅序列化模型數(shù)據(jù),無狀態(tài)/頭控制Spring MVC + Jackson

關(guān)鍵差異總結(jié)(新增 MappingJackson2JsonView)

控制粒度

  • ResponseEntity 提供最高控制(狀態(tài)碼、頭、數(shù)據(jù))。
  • @JsonView 用于字段級(jí)序列化控制。
  • MappingJackson2JsonView 僅能序列化模型數(shù)據(jù),無法控制狀態(tài)碼或頭。

代碼簡潔性

  • @RestController@ResponseBody 更簡潔。
  • MappingJackson2JsonView 需要額外配置視圖和解析器,代碼復(fù)雜度較高。

適用場景

  • MappingJackson2JsonView:適合需要與傳統(tǒng)視圖(如 JSP)共存的場景,或在舊代碼中逐步遷移時(shí)使用。
  • 其他方式(如 @RestController)更推薦用于現(xiàn)代 RESTful API 開發(fā)。

依賴與配置

  • MappingJackson2JsonView 需要顯式配置視圖和視圖解析器,而其他方式依賴注解和消息轉(zhuǎn)換器。

注意事項(xiàng)

  • MappingJackson2JsonView 的局限性
    • 需要通過模型傳遞數(shù)據(jù),無法直接返回對(duì)象。
    • 無法直接設(shè)置 HTTP 狀態(tài)碼或頭信息,需通過 @ResponseStatusHandlerInterceptor 間接實(shí)現(xiàn)。
  • 推薦場景
    • 在需要與傳統(tǒng)視圖(如 JSP)共存的項(xiàng)目中,MappingJackson2JsonView 可作為過渡方案。
    • 現(xiàn)代項(xiàng)目中更推薦使用 @RestControllerResponseEntity,因其簡潔性和靈活性。

通過新增 MappingJackson2JsonView 的對(duì)比,可以更全面地理解 Spring MVC 返回 JSON 的多種方式及其適用場景。

以上就是Spring MVC返回JSON視圖的六種方式及對(duì)比詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC返回JSON視圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java.net.http.HttpClient使用示例解析

    java.net.http.HttpClient使用示例解析

    這篇文章主要為大家介紹了java.net.http.HttpClient使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot集成Druid監(jiān)控頁面最小化配置操作

    SpringBoot集成Druid監(jiān)控頁面最小化配置操作

    這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁面最小化配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 關(guān)于Android觸摸事件分發(fā)的原理詳析

    關(guān)于Android觸摸事件分發(fā)的原理詳析

    觸摸事件分發(fā)機(jī)制一直以來都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot自動(dòng)配置原理詳解

    SpringBoot自動(dòng)配置原理詳解

    SpringBoot的誕生就是為了簡化Spring中繁瑣的XML配置,其本質(zhì)依然還是Spring框架,使用SpringBoot之后可以不使用任何XML配置來啟動(dòng)一個(gè)服務(wù),使得我們?cè)谑褂梦⒎?wù)架構(gòu)時(shí)可以更加快速的建立一個(gè)應(yīng)用。本文將為具體介紹一下SpringBoot的原理,需要的可以參考一下
    2021-12-12
  • IDEA類和方法注釋模板設(shè)置全過程

    IDEA類和方法注釋模板設(shè)置全過程

    文章介紹了如何在IDEA中使用自定義的注釋模板,包括類注釋模板和方法注釋模板的設(shè)置方法,類注釋模板可以通過編輯File?and?Code?Templates來實(shí)現(xiàn),而方法注釋模板可以通過LiveTemplates功能創(chuàng)建
    2026-01-01
  • SpringBoot中自定義參數(shù)綁定步驟詳解

    SpringBoot中自定義參數(shù)綁定步驟詳解

    這篇文章主要介紹了SpringBoot中自定義參數(shù)綁定步驟詳解,非常不錯(cuò),具有參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-02-02
  • 基于springboot實(shí)現(xiàn)整合shiro實(shí)現(xiàn)登錄認(rèn)證以及授權(quán)過程解析

    基于springboot實(shí)現(xiàn)整合shiro實(shí)現(xiàn)登錄認(rèn)證以及授權(quán)過程解析

    這篇文章主要介紹了基于springboot實(shí)現(xiàn)整合shiro實(shí)現(xiàn)登錄認(rèn)證以及授權(quán)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JAVA多線程編程實(shí)例詳解

    JAVA多線程編程實(shí)例詳解

    這篇文章主要介紹了JAVA多線程編程,結(jié)合實(shí)例形式總結(jié)分析了多線程、鎖、線程池等相關(guān)原理及使用技巧,需要的朋友可以參考下
    2019-09-09
  • MyBatis使用接口映射的方法步驟

    MyBatis使用接口映射的方法步驟

    映射器是MyBatis中最核心的組件之一,本文主要介紹了MyBatis使用接口映射的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn)

    使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn)

    這篇文章主要給大家介紹了關(guān)于使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn),在插入一條數(shù)據(jù)之后需要返回它的自增主鍵id,因?yàn)椴迦氲膶?shí)體類數(shù)據(jù)id為空,后面的邏輯還需要這個(gè)id,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

福海县| 雷波县| 东辽县| 华池县| 崇仁县| 志丹县| 澎湖县| 邵武市| 四会市| 廊坊市| 鄄城县| 赣州市| 慈溪市| 济南市| 肥乡县| 大名县| 云安县| 江城| 河间市| 封丘县| 连州市| 苍山县| 海伦市| 连云港市| 都江堰市| 焦作市| 吴江市| 徐汇区| 张家口市| 漳浦县| 北票市| 南投市| 开阳县| 乌兰浩特市| 崇信县| 海阳市| 阿坝县| 新乡市| 尼玛县| 平乡县| 新和县|