自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

太強(qiáng)了!Spring Boot 3.4 的 @JsonView 注解,讓接口返回靈活到飛起!

開發(fā) 前端
在 Spring Boot 3.4 的加持下,搭配 Jackson 的 @JsonView,你可以優(yōu)雅地應(yīng)對(duì)各種接口返回需求,真正實(shí)現(xiàn)“靈活到飛起”的數(shù)據(jù)控制!?

在實(shí)際開發(fā)中,前后端分離的系統(tǒng)通常會(huì)用 JSON 來(lái)傳遞數(shù)據(jù)。但不同行為場(chǎng)景下,前端所需的數(shù)據(jù)范圍是不同的。舉個(gè)例子,產(chǎn)品列表只需要展示商品的基本信息,如商品名、價(jià)格等;而商品詳情頁(yè)就得展示完整信息,比如庫(kù)存、供應(yīng)商、采購(gòu)價(jià)等等。

傳統(tǒng)做法是定義多個(gè) DTO 分別應(yīng)對(duì)不同的展示需求,但這樣做容易產(chǎn)生大量重復(fù)代碼,維護(hù)起來(lái)也會(huì)相當(dāng)頭疼。

幸好,Spring Boot 提供了對(duì) Jackson 的 @JsonView 注解的支持,它就像一個(gè)靈活的“數(shù)據(jù)可見性開關(guān)”——可以幫我們按需返回不同的數(shù)據(jù)字段,既保持了數(shù)據(jù)結(jié)構(gòu)統(tǒng)一,又能減輕維護(hù)負(fù)擔(dān)。

原理淺析

@JsonView 來(lái)源于 Jackson,它的工作方式非常巧妙:

  1. 定義幾個(gè)“視圖接口”(通常是空接口)。
  2. 在實(shí)體類的字段上用 @JsonView 標(biāo)明字段在哪些視圖中可見。
  3. 控制器里用 @JsonView(View.class) 指定序列化用哪個(gè)視圖。

這樣就可以根據(jù)場(chǎng)景有選擇性地返回?cái)?shù)據(jù)字段。

實(shí)戰(zhàn)演練:用 @JsonView 玩轉(zhuǎn)返回字段

我們以一個(gè)商品 Product 實(shí)體作為例子進(jìn)行講解。

定義實(shí)體類

package com.icoderoad.model;


import com.fasterxml.jackson.annotation.JsonView;


public class Product {


    // 定義視圖接口
    public interface BasicInfo {}
    public interface DetailedInfo extends BasicInfo {}


    @JsonView(BasicInfo.class)
    private Long id;


    @JsonView(BasicInfo.class)
    private String name;


    @JsonView(BasicInfo.class)
    private Double price;


    @JsonView(DetailedInfo.class)
    private Integer stock;


    @JsonView(DetailedInfo.class)
    private String supplier;


    @JsonView(BasicInfo.class)
    private String category;


    // 構(gòu)造函數(shù)
    public Product(Long id, String name, Double price, Integer stock, String supplier, String category) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.stock = stock;
        this.supplier = supplier;
        this.category = category;
    }


    // getter & setter 省略
}

控制器用法示例

package com.icoderoad.controller;


import com.fasterxml.jackson.annotation.JsonView;
import com.icoderoad.model.Product;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/products")
public class ProductController {


    // 只返回基礎(chǔ)信息
    @JsonView(Product.BasicInfo.class)
    @GetMapping("/basic")
    public Product getBasicProduct() {
        return new Product(1L, "iPhone 15", 8999.0, 200, "Apple", "Electronics");
    }


    // 返回所有字段
    @JsonView(Product.DetailedInfo.class)
    @GetMapping("/detail")
    public Product getDetailedProduct() {
        return new Product(1L, "iPhone 15", 8999.0, 200, "Apple", "Electronics");
    }
}

不同接口就像不同“窗口”,只展示自己該展示的數(shù)據(jù)。

編程式控制返回字段

如果你希望動(dòng)態(tài)指定視圖而不是用注解,也可以用 MappingJacksonValue:

@GetMapping("/dynamic")
public MappingJacksonValue dynamicView() {
    Product product = new Product(1L, "iPhone 15", 8999.0, 200, "Apple", "Electronics");
    MappingJacksonValue wrapper = new MappingJacksonValue(product);
    wrapper.setSerializationView(Product.BasicInfo.class);
    return wrapper;
}

配合 Thymeleaf 或 MVC 頁(yè)面展示

你也可以在 MVC 頁(yè)面中返回 JSON 數(shù)據(jù),并用視圖控制字段:

@Controller
public class ProductViewController {


    @GetMapping("/product/view")
    public ModelAndView viewProduct(Model model) {
        Product product = new Product(1L, "iPhone 15", 8999.0, 200, "Apple", "Electronics");
        model.addAttribute("product", product);
        model.addAttribute(JsonView.class.getName(), Product.BasicInfo.class);
        return new ModelAndView(new MappingJackson2JsonView());
    }
}

這里的關(guān)鍵點(diǎn)是:把 JsonView 的類全限定名作為 key 放入 model 中,然后使用 Jackson 的 JSON View 進(jìn)行渲染。

控制反序列化(限制字段反解析)

@JsonView 不僅可以控制輸出,也可以限制 JSON 字段的反序列化行為:

@PostMapping("/deserialize")
publicProductdeserialize(@RequestBodyString json)throwsException{
    ObjectMapper mapper =newObjectMapper();
    return mapper
            .readerWithView(Product.BasicInfo.class)
            .forType(Product.class)
            .readValue(json);
}

像上面的代碼,如果 JSON 中包含 supplier 或 stock,也不會(huì)被反序列化出來(lái)。

設(shè)置默認(rèn)行為(全量輸出未注解字段)

默認(rèn)情況下,未打 @JsonView 注解的字段不會(huì)被返回。

不過(guò),我們可以通過(guò)如下配置調(diào)整:

spring:
  jackson:
    mapper:
      default-view-inclusion: true

如果你加上這個(gè)配置,就算某個(gè)字段沒有標(biāo)注 @JsonView,也會(huì)被默認(rèn)輸出(前提是你仍然在接口上標(biāo)了某個(gè)視圖)。

總結(jié)

@JsonView 是一個(gè)非常強(qiáng)大而靈活的工具,特別適合處理字段輸出差異化需求:

  • 不需要定義多個(gè)冗余 DTO;
  • 數(shù)據(jù)結(jié)構(gòu)統(tǒng)一,維護(hù)性高;
  • 支持注解和編程式兩種方式;
  • 輸出、反序列化都可以控制;
  • 配合 MVC 視圖同樣適用!

在 Spring Boot 3.4 的加持下,搭配 Jackson 的 @JsonView,你可以優(yōu)雅地應(yīng)對(duì)各種接口返回需求,真正實(shí)現(xiàn)“靈活到飛起”的數(shù)據(jù)控制!

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2025-01-13 13:47:13

2025-04-08 02:22:22

SpringJackson注解

2025-04-08 01:00:00

Spring開發(fā)系統(tǒng)

2025-03-26 08:28:36

2025-04-10 00:22:22

Spring@JsonView字段

2025-01-22 14:02:35

2022-05-30 16:31:08

CSS

2025-02-08 08:00:00

JavaDeepSeekIDEA

2025-03-13 00:25:00

SpringJava瀏覽器

2025-04-02 04:55:00

2021-03-04 09:31:42

開源技術(shù) 項(xiàng)目

2023-12-10 20:33:50

Redis搜索全文

2025-02-26 10:00:00

開發(fā)APIJava

2022-03-16 19:36:16

Python工具代碼

2022-08-11 10:07:59

Python工具代碼

2024-01-30 09:21:29

CSS文字效果文字裝飾

2021-08-05 16:25:37

Windows 11Windows微軟

2022-06-08 08:01:28

模板字面量類型

2025-03-10 01:00:00

Spring參數(shù)解析器

2023-06-02 16:24:46

SpringBootSSM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)