SpringBoot項(xiàng)目中忽略某屬性返回?cái)?shù)據(jù)給前端
在使用Spring Boot開發(fā)應(yīng)用程序時(shí),經(jīng)常會(huì)遇到需要返回DTO(數(shù)據(jù)傳輸對(duì)象)的情況,而不是返回實(shí)體類。有時(shí)候,實(shí)體類中的某些字段可能包含敏感信息或不需要傳遞給客戶端。在這種情況下,我們需要找到一種方法來忽略這些字段并只返回需要的數(shù)據(jù)。
一、忽略實(shí)體類中的屬性
1、@JsonIgnore
@JsonIgnore注解是Jackson庫(kù)中的一個(gè)注解,用于在實(shí)體類向前臺(tái)返回?cái)?shù)據(jù)時(shí)忽略不想傳遞給前臺(tái)的屬性或接口。當(dāng)你在Java類的某個(gè)屬性或方法上添加@JsonIgnore注解時(shí),Jackson在將對(duì)象序列化為JSON時(shí)將會(huì)忽略這個(gè)屬性或方法,也就是說這個(gè)屬性或方法將不會(huì)出現(xiàn)在生成的JSON字符串中。這對(duì)于那些你不希望暴露給前端的屬性(如密碼、敏感信息等)非常有用。
例如,在User類中,如果你有一個(gè)password屬性,并且你不希望在前臺(tái)看到這個(gè)屬性,你可以在password屬性上添加@JsonIgnore注解。
此外,還有一個(gè)類似的注解叫做@JsonIgnoreProperties,這是一個(gè)類注解,用于在json序列化時(shí)將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。你可以在類上添加這個(gè)注解,并指定要忽略的屬性名列表。
需要注意的是,如果在使用fastJson而不是Jackson作為JSON處理庫(kù),那么@JsonIgnore注解可能不會(huì)生效。在fastJson中,你需要使用@JSONField(serialize = false)注解來達(dá)到相同的效果。
2、@JSONField(serialize = false)
@JSONField注解是阿里巴巴fastjson庫(kù)中的注解,用于控制Java對(duì)象與JSON字符串之間的轉(zhuǎn)換。它可以用于控制序列化和反序列化過程中的一些細(xì)節(jié),例如日期格式、序列化順序、字段名稱等。
@JSONField注解可以作用在方法、屬性以及方法中的參數(shù)上。在JSONField注解中,name屬性用來指定JSON串中key的名稱。例如,@JSONField(name = “id”)表示將Java對(duì)象中的userId字段映射到JSON字符串中的"id"字段。
此外,@JSONField注解還有其他一些常用的屬性,如:
format:用于指定日期或數(shù)字的格式。例如,@JSONField(format = “yyyy-MM-dd HH:mm:ss”)表示將Java對(duì)象中的createTime字段按照指定的日期格式轉(zhuǎn)換為JSON字符串。serialize:用于指定是否序列化某個(gè)字段。例如,@JSONField(serialize = false)表示不序列化某個(gè)字段。ordinal:用于指定序列化順序,數(shù)值越小越先序列化。
通過使用@JSONField注解,你可以靈活地控制Java對(duì)象與JSON字符串之間的轉(zhuǎn)換,實(shí)現(xiàn)更復(fù)雜的序列化和反序列化需求。
3、@JsonInclude
@JsonInclude 是 Jackson 庫(kù)中的一個(gè)注解,它用于定制在序列化(即將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串)過程中哪些屬性應(yīng)該被包含在內(nèi)。這個(gè)注解可以用于類、方法或字段,以定義如何包含字段值。
Jackson 提供了幾種不同的 Include 策略:
JsonInclude.Include.ALWAYS:始終包含屬性,無論其值是什么。
JsonInclude.Include.NON_ABSENT:包含非空的(non-absent)屬性。這相當(dāng)于 NON_NULL(非空)加上非空集合、非空映射等。JsonInclude.Include.NON_DEFAULT:包含其值不等于字段默認(rèn)值的屬性。這需要注意,對(duì)于基本數(shù)據(jù)類型(如 int、long 等),它們的默認(rèn)值通常是 0 或 false,而對(duì)于包裝類型(如 Integer、Long 等),默認(rèn)值是 null。
JsonInclude.Include.NON_EMPTY:對(duì)于字符串,只包含非空字符串;對(duì)于集合、數(shù)組和映射,只包含非空集合。JsonInclude.Include.NON_NULL:只包含非空(non-null)屬性。
JsonInclude.Include.CUSTOM:使用自定義的包含策略。
例如,如果你有一個(gè)類并且你只想在序列化時(shí)包含非空的字段,你可以這樣做:
import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_NULL) public class MyObject { private String name; private Integer age; // getters and setters }
在這個(gè)例子中,如果 name 或 age 字段的值為 null,那么在序列化 MyObject 的實(shí)例為 JSON 字符串時(shí),這些字段將不會(huì)被包含在內(nèi)。
這個(gè)注解非常有用,因?yàn)樗梢詭椭憧刂粕傻?JSON 字符串的大小和可讀性,尤其是在你有很多可選字段或嵌套對(duì)象的情況下。
二、忽略實(shí)體類中的方法返回值
@Transient注解是Java EE規(guī)范提供的javax.persistence包定義的注解之一。這個(gè)注解的作用是指定該屬性或字段不是永久的,即告訴MyBatis不需要將該字段映射為數(shù)據(jù)庫(kù)表的列,也就是標(biāo)記實(shí)體類中不需要持久化到數(shù)據(jù)庫(kù)的字段。
@Transient注解的使用不僅限于實(shí)體類上有@Table注解的屬性,它可以用在任何實(shí)體類的字段或者方法上。無論實(shí)體類是否有@Table注解,只要被@Transient注解標(biāo)記的字段或方法都會(huì)被忽略,不進(jìn)行數(shù)據(jù)庫(kù)映射操作。
此外,@Transient注解也可以用于Java序列化過程中,用于標(biāo)記不希望序列化的字段。當(dāng)對(duì)象被序列化時(shí),被標(biāo)記為@Transient的字段將被忽略。
總的來說,@Transient注解的主要作用是在Java EE的持久化和序列化過程中,告訴系統(tǒng)哪些字段或?qū)傩圆恍枰惶幚怼?/p>
@Data public class ResourceParam { private String field1; private String field2; private String field3; @Transient public String getTest() { return “string”; } }
總結(jié)
在Spring Boot中,我們可以使用多種方法來忽略返回?cái)?shù)據(jù)中的字段。無論是使用@JsonIgnore注解、Projection投影、@JsonIgnoreProperties注解還是自定義序列化器,都能達(dá)到我們的目的。
在實(shí)際應(yīng)用中,根據(jù)具體場(chǎng)景和需求選擇合適的方法。請(qǐng)記住,保護(hù)敏感信息和減少數(shù)據(jù)傳輸是很重要的。通過忽略不必要的字段,我們可以提高系統(tǒng)的性能和安全性。
相關(guān)文章
springboot打包實(shí)現(xiàn)項(xiàng)目JAR包和依賴JAR包分離
這篇文章主要介紹了springboot打包實(shí)現(xiàn)項(xiàng)目JAR包和依賴JAR包分離,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02javax.persistence中@Column定義字段類型方式
這篇文章主要介紹了javax.persistence中@Column定義字段類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11SpringBoot整合JWT框架,解決Token跨域驗(yàn)證問題
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以JSON對(duì)象的形式安全的傳遞信息。2021-06-06SpringBoot @CompentScan excludeFilters配置無效的解決方案
這篇文章主要介紹了SpringBoot @CompentScan excludeFilters配置無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java基礎(chǔ)之Collection與Collections和Array與Arrays的區(qū)別
這篇文章主要介紹了java基礎(chǔ)之Collection與Collections和Array與Arrays的區(qū)別的相關(guān)資料,本文主要說明兩者的區(qū)別以防大家混淆概念,需要的朋友可以參考下2017-08-08SpringBoot3中token攔截器鏈的設(shè)計(jì)與實(shí)現(xiàn)步驟
本文介紹了spring boot后端服務(wù)開發(fā)中有關(guān)如何設(shè)計(jì)攔截器的思路,文中通過代碼示例和圖文講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03