SpringBoot配置返回?cái)?shù)據(jù)不存在null的問題小結(jié)
一、引言
最近在做項(xiàng)目中遇到一個(gè)神奇的問題,在測(cè)試返回銀行三級(jí)數(shù)據(jù)的時(shí)候有的項(xiàng)目中返回的數(shù)據(jù)中把null值的數(shù)據(jù)返回了,而有的時(shí)候就不存在null值數(shù)據(jù),如下所示:
存在null值情況
不含null值情況
但是我們可以看一下返回的VO的數(shù)據(jù)結(jié)果如下:
import lombok.Data; import java.util.List; /* * @description 銀行 * @author 羅添煦 * @create 2024-08-30 下午12:38 */ @Data public class BankEntity { private String bankName; private String bankCode; private List<BankEntity> children; }
二、jackson
因?yàn)樯厦娴膯栴}出現(xiàn)帶著好奇心的我,就去搜索了大量的資料,發(fā)現(xiàn)在springboot中默認(rèn)支持的序列化器是jackson,可能你沒有聽說過jackson這個(gè)序列化器,但是你應(yīng)該在項(xiàng)目中使用過alibaba的序列化工具fastjson。
1、默認(rèn)情況下,ObjectMapper 在序列化對(duì)象時(shí),將實(shí)體所有的字段一 一序列化,無論這些字段是否有值,是否為 null。
2、如果實(shí)體的某個(gè)字段沒有提供 getter 方法,則該字段不會(huì)被序列化。
3、Spring Boot Web 組件默認(rèn)使用 Jackson 進(jìn)行對(duì)象的序列化與反序列化,即頁面?zhèn)魅氲膮?shù),會(huì)自動(dòng)反序列化為后臺(tái)對(duì)象,后臺(tái)傳給前端的對(duì)象,也會(huì)序列化后輸出。所以需要注意返回給頁面的對(duì)象默認(rèn)不能使用 Jackson 以外的 Json 庫序列化,比如返回一個(gè) Gson 的 JsonObject 給前端,則會(huì)報(bào)錯(cuò),因?yàn)轱@然 Jackson 序列化時(shí)會(huì)失敗。
4、Jackson 提供三種不同的方法來操作 JSON:
1)流式API - 使用 Stream(流) 的方式對(duì) Json 的每一個(gè)組成部分進(jìn)行最細(xì)粒度的控制,JsonParser 讀取數(shù)據(jù),JsonGenerator 寫入數(shù)據(jù)。
2)樹模型 - 將 JSON 文件在內(nèi)存里以樹的形式表示,通過 JsonNode 處理單個(gè)Json節(jié)點(diǎn),類似于 XML 的 DOM 解析器。(常用)
3)databind 模塊 - ObjectMapper 讀/寫 JSON 是 POJO 序列化與反序列化 Json 最方便的方式。(常用)
但是這個(gè)地方我們就不過多的去介紹使用Jackson我們還是來看一下是如何解決響應(yīng)數(shù)據(jù)中不含null值這個(gè)問題的。
三、配置jackson
處理方法1、返回json中的null字段-不顯示
配置文件添加 spring.jackson.default-property-inclusion=non_null 配置
處理方法2、返回json中的null字段-轉(zhuǎn)為空字符串
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.io.IOException; /** * 處理 jackson 返回的null值 * 返回json中的null值轉(zhuǎn)為空字符串 */ @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(""); } }); return objectMapper; } }
但是這種方式只是把返回null的數(shù)據(jù)返回成為了空字符串,和我們需要的看不到參數(shù)還是有差距的。
jackson其他配置,我們可以配置Jackson返回時(shí)間的類型。
我們可以看一下springboot默認(rèn)幫我們配置的時(shí)間類型的返回?cái)?shù)據(jù)是什么格式。
在不指定任何特殊配置的情況下,返回的 date 類型的字段會(huì)自動(dòng)轉(zhuǎn)成 UTC 格式字符串,形如 "2024-09-02T01:51:24.091+00:00"
。
但是我們想要變成yyyy-MM-dd HH:mm:ss這種格式的話我們就可以在字段上添加注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime;
經(jīng)過配置以后返回?cái)?shù)據(jù)如下所示:
到此這篇關(guān)于SpringBoot配置返回?cái)?shù)據(jù)不存在null的問題小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot返回null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)升級(jí)版布谷鳥闖關(guān)游戲的示例代碼
升級(jí)版布谷鳥闖關(guān)游戲是一個(gè)基于java的布谷鳥闖關(guān)游戲,鼠標(biāo)左鍵點(diǎn)擊控制鳥的位置穿過管道間的縫隙。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-02-02spring?boot使用@Async注解解決異步多線程入庫的問題
最近在寫項(xiàng)目是需要添加異步操作來提高效率,所以下面這篇文章主要給大家介紹了關(guān)于spring?boot使用@Async注解解決異步多線程入庫問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05java實(shí)現(xiàn)微信小程序登錄態(tài)維護(hù)的示例代碼
本篇文章主要介紹了java實(shí)現(xiàn)微信小程序登錄態(tài)維護(hù)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Jupiter和Junit5之間有什么聯(lián)系?Jupiter提供了哪些新的測(cè)試方法?如何用IDEA和Jupiter生成可讀性更好的測(cè)試報(bào)告?文中有非常詳細(xì)的說明,需要的朋友可以參考下2021-06-06詳解大數(shù)據(jù)處理引擎Flink內(nèi)存管理
Flink是jvm之上的大數(shù)據(jù)處理引擎,jvm存在java對(duì)象存儲(chǔ)密度低、full gc時(shí)消耗性能,gc存在stw的問題,同時(shí)omm時(shí)會(huì)影響穩(wěn)定性。針對(duì)頻繁序列化和反序列化問題flink使用堆內(nèi)堆外內(nèi)存可以直接在一些場景下操作二進(jìn)制數(shù)據(jù),減少序列化反序列化消耗。本文帶你詳細(xì)理解其原理。2021-05-05spring中定時(shí)任務(wù)taskScheduler的詳細(xì)介紹
這篇文章主要介紹了spring中定時(shí)任務(wù)taskScheduler的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。2017-02-02Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09