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

SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn)

 更新時間:2025年02月10日 10:14:43   作者:小杰不禿頭  
本文主要介紹了SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在學(xué)習(xí)過程中發(fā)現(xiàn)了Jackson庫的@JsonView也可以改變JSON的輸出結(jié)構(gòu),并且可以更加精細(xì)的控制,我平時一般都會定義一些DTO去封裝響應(yīng)數(shù)據(jù),使用這種方法可以不用創(chuàng)建DTO,更加優(yōu)雅且高效的方式來實(shí)現(xiàn)。??

一、如何使用@JsonView這個注解?

我們可以創(chuàng)建多個視圖,每個視圖代表了一組特定的字段。然后,在控制器的方法上,我們可以通過應(yīng)用這些視圖來指定應(yīng)該使用哪些字段來序列化返回的實(shí)體對象。這種靈活性使得我們能夠輕松應(yīng)對各種復(fù)雜的業(yè)務(wù)需求。

二、應(yīng)用場景

  • 數(shù)據(jù)暴露級別的控制

假設(shè)你有一個用戶實(shí)體(User),包含了一些基本信息(如姓名、年齡)和一些敏感信息(如密碼、郵箱、身份證)。當(dāng)你需要提供一個 API 來獲取用戶的基本信息時,你可能不希望暴露敏感信息。通過使用 @JsonView,你可以定義兩個視圖:一個包含基本信息,另一個包含所有信息。然后,在對應(yīng)的 API 方法上,你可以使用相應(yīng)的視圖來控制輸出的數(shù)據(jù)。

  • 根據(jù)用戶角色定制數(shù)據(jù)

在某些情況下,不同的用戶角色可能需要看到不同級別的數(shù)據(jù)。例如,管理員可能需要看到用戶的所有信息,而普通用戶只能看到基本信息。通過使用 @JsonView 和 Spring Security,你可以根據(jù)用戶的角色來動態(tài)地決定應(yīng)該暴露哪些數(shù)據(jù)。

  • API 版本控制

當(dāng)你的 API 隨時間發(fā)展并引入新功能時,可能會有多個版本的 API。在某些情況下,舊版本的 API 可能不需要包含新引入的字段。通過 @JsonView,你可以為每個 API 版本定義一個視圖,并在需要時切換到相應(yīng)的視圖。

  • 數(shù)據(jù)聚合和拆分

在某些情況下,你可能需要將多個實(shí)體的數(shù)據(jù)聚合到一個 JSON 響應(yīng)中,或者將一個大實(shí)體的數(shù)據(jù)拆分成多個小實(shí)體。通過使用 @JsonView,你可以更輕松地實(shí)現(xiàn)這種數(shù)據(jù)的聚合和拆分。

三、實(shí)戰(zhàn)案例

定義視圖規(guī)則:

public interface UserView {
    // 展示基本信息
     interface Basic {}
    // 沒有密碼
     interface WithoutPassword extends Basic {}
    // 展示所有的信息
     interface Full extends Basic {}
}

定義一個User,在屬性上面添加@JSsonView注解,并指定視圖

@Data
@AllArgsConstructor
public class User {
    @JsonView(UserView.Basic.class)
    private Long id;
    @JsonView(UserView.Basic.class)
    private String username;
    @JsonView(UserView.Full.class)
    private String password;
    @JsonView(UserView.Basic.class)
    private String nickName;
    @JsonView(UserView.Basic.class)
    private String email;
    @JsonView({UserView.Basic.class,UserView.WithoutPassword.class})
    private String phone;
}

在控制器方法上指定視圖,一共有兩種方式:注解方式和編程方式。

注解方式

@RestController
public class testController {
    @GetMapping("/user/basic")
    @JsonView(UserView.Basic.class)
    public User userBasic(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        return user;
    }
    @GetMapping("/user/noPassword")
    @JsonView(UserView.WithoutPassword.class)
    public User userNoPassword(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        return user;
    }
    @GetMapping("/user/full")
    @JsonView(UserView.Full.class)
    public User userFull(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        return user;
    }
}

注意:@JsonView允許一個視圖類的數(shù)組,但你只能為每個控制器方法指定一個。如果需要激活多個視圖,可以使用復(fù)合接口。

對上面三個接口測試:

//   user/basic
{
  "id": 1,
  "username": "admin",
  "nickName": "小杰不禿頭",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

//   user/noPassword
{
  "id": 1,
  "username": "admin",
  "nickName": "小杰不禿頭",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

//   user/full
{
  "id": 1,
  "username": "admin",
  "password": "123456",
  "nickName": "小杰不禿頭",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

編程方式

@RestController
public class testController {
    @GetMapping("/user/basic")
    //@JsonView(UserView.Basic.class)
    public MappingJacksonValue userBasic(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.Basic.class);
        return mappingJacksonValue;
    }
    @GetMapping("/user/noPassword")
    //@JsonView(UserView.WithoutPassword.class)
    public MappingJacksonValue userNoPassword(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.WithoutPassword.class);
        return mappingJacksonValue;
    }
    @GetMapping("/user/full")
    //@JsonView(UserView.Full.class)
    public MappingJacksonValue userFull(){
        User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.Full.class);
        return mappingJacksonValue;
    }
}

//測試結(jié)果跟上面一致

注意:接口返回值必須為MappingJacksonValue。

總結(jié) 

@JsonView提供了一種靈活且強(qiáng)大的方式來控制序列化的 JSON 數(shù)據(jù)。通過定義視圖和將它們應(yīng)用到屬性和控制器方法上,你可以根據(jù)需要暴露不同級別的數(shù)據(jù),實(shí)現(xiàn) API 的數(shù)據(jù)定制化。

@JsonView也可以結(jié)合其他的注解一起使用,可以更精細(xì)的控制,比如:@JsonInclude、@JsonIgnore等等

到此這篇關(guān)于SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot定制響應(yīng)JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jmeter工作原理及常見錯誤解析

    Jmeter工作原理及常見錯誤解析

    這篇文章主要介紹了Jmeter工作原理及常見錯誤解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 教你如何編寫簡單的網(wǎng)絡(luò)爬蟲

    教你如何編寫簡單的網(wǎng)絡(luò)爬蟲

    實(shí)際的爬蟲是從一系列的種子鏈接開始。種子鏈接是起始節(jié)點(diǎn),種子頁面的超鏈接指向的頁面是子節(jié)點(diǎn)(中間節(jié)點(diǎn)),對于非html文檔,如excel等,不能從中提取超鏈接,看做圖的終端節(jié)點(diǎn)
    2013-10-10
  • Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例

    Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例

    這篇文章主要介紹了Java實(shí)現(xiàn)Kafka生產(chǎn)者和消費(fèi)者的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Kafka集群的搭建與批量啟停方式

    Kafka集群的搭建與批量啟停方式

    Kafka是一個分布式的基于發(fā)布/訂閱模式的消息隊(duì)列,適用于大數(shù)據(jù)實(shí)時處理,本文詳細(xì)介紹了如何在CentOS 7上搭建Kafka集群,包括服務(wù)器配置、配置文件修改、服務(wù)啟動和關(guān)閉腳本編寫
    2025-11-11
  • springboot mybatis調(diào)用多個數(shù)據(jù)源引發(fā)的錯誤問題

    springboot mybatis調(diào)用多個數(shù)據(jù)源引發(fā)的錯誤問題

    這篇文章主要介紹了springboot mybatis調(diào)用多個數(shù)據(jù)源引發(fā)的錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot項(xiàng)目作為文件服務(wù)器配置方式

    SpringBoot項(xiàng)目作為文件服務(wù)器配置方式

    本文介紹了使用Spring Boot和Kkfileview實(shí)現(xiàn)文件在線預(yù)覽功能的配置過程,包括yml配置、webmvc配置、攔截器配置以及部署到服務(wù)器時的注意事項(xiàng)
    2025-12-12
  • Eclipse安裝Aptana插件(注意對應(yīng)版本問題)

    Eclipse安裝Aptana插件(注意對應(yīng)版本問題)

    這篇文章主要為大家詳細(xì)介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對應(yīng)版本問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • java中如何執(zhí)行xshell命令

    java中如何執(zhí)行xshell命令

    這篇文章主要介紹了java中如何執(zhí)行xshell命令,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Springboot?中使用Sentinel的詳細(xì)步驟

    Springboot?中使用Sentinel的詳細(xì)步驟

    文章介紹了如何在SpringBoot中使用Sentinel進(jìn)行限流和熔斷降級,首先添加依賴,配置Sentinel控制臺地址,定義受保護(hù)的資源,配置流控規(guī)則,啟動Sentinel控制臺和SpringBoot應(yīng)用,最后測試和監(jiān)控,感興趣的朋友一起看看吧
    2025-02-02
  • SpringMVC統(tǒng)一異常處理實(shí)例代碼

    SpringMVC統(tǒng)一異常處理實(shí)例代碼

    這篇文章主要介紹了SpringMVC統(tǒng)一異常處理實(shí)例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論

伽师县| 读书| 宜君县| 邵阳县| 武宁县| 宁武县| 阿勒泰市| 新晃| 曲阜市| 大宁县| 宁化县| 古蔺县| 称多县| 宜良县| 安塞县| 清远市| 昌吉市| 宁南县| 岳普湖县| 金堂县| 湘阴县| 彰化县| 永福县| 哈尔滨市| 高雄县| 论坛| 城市| 双江| 康保县| 白山市| 阿拉善盟| 逊克县| 深水埗区| 治县。| 五台县| 灵台县| 廉江市| 龙泉市| 洱源县| 乐平市| 威海市|