SpringBoot設(shè)置Json返回字段為非空問(wèn)題
前言
各位同學(xué)可能遇到過(guò)下述問(wèn)題,在項(xiàng)目開(kāi)發(fā)中,后端是以Json格式的數(shù)據(jù)返回給前端,但是對(duì)于數(shù)據(jù)為空的字段,可能出現(xiàn)NULL,這讓前端同學(xué)很痛苦,于是他們想,針對(duì)那些為null的字段,后端能不能把String類型的數(shù)據(jù)返回空字符串,int類型的數(shù)據(jù)返回0,集合和數(shù)組返回[],這樣多方便呢!
OK,既然這樣的話就滿足他們的要求,本文利用Spring自帶的Json轉(zhuǎn)化器,將返回給前端的數(shù)據(jù)進(jìn)行處理,見(jiàn)下文所示。
一、編寫Json數(shù)據(jù)轉(zhuǎn)化器
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 json數(shù)據(jù)轉(zhuǎn)化器
*/
public class JacksonHttpMessageConverter extends MappingJackson2HttpMessageConverter {
/**
* 處理數(shù)組類型的null值
*/
public class NullArrayJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
if (value == null) {
jgen.writeStartArray();
jgen.writeEndArray();
}
}
}
/**
* 處理字符串類型的null值
*/
public class NullStringJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString(StringUtils.EMPTY);
}
}
/**
* 處理數(shù)字類型的null值
*/
public class NullNumberJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeNumber(0);
}
}
/**
* 處理布爾類型的null值
*/
public class NullBooleanJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeBoolean(false);
}
}
public class MyBeanSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
//循環(huán)所有的beanPropertyWriter
for (Object beanProperty : beanProperties) {
BeanPropertyWriter writer = (BeanPropertyWriter) beanProperty;
//判斷字段的類型,如果是array,list,set則注冊(cè)nullSerializer
if (isArrayType(writer)) {
//給writer注冊(cè)一個(gè)自己的nullSerializer
writer.assignNullSerializer(new NullArrayJsonSerializer());
} else if (isNumberType(writer)) {
writer.assignNullSerializer(new NullNumberJsonSerializer());
} else if (isBooleanType(writer)) {
writer.assignNullSerializer(new NullBooleanJsonSerializer());
} else if (isStringType(writer)) {
writer.assignNullSerializer(new NullStringJsonSerializer());
}
}
return beanProperties;
}
/**
* 是否是數(shù)組
*/
private boolean isArrayType(BeanPropertyWriter writer) {
Class<?> clazz = writer.getType().getRawClass();
return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
}
/**
* 是否是string
*/
private boolean isStringType(BeanPropertyWriter writer) {
Class<?> clazz = writer.getType().getRawClass();
return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
}
/**
* 是否是int
*/
private boolean isNumberType(BeanPropertyWriter writer) {
Class<?> clazz = writer.getType().getRawClass();
return Number.class.isAssignableFrom(clazz);
}
/**
* 是否是boolean
*/
private boolean isBooleanType(BeanPropertyWriter writer) {
Class<?> clazz = writer.getType().getRawClass();
return clazz.equals(Boolean.class);
}
}
public JacksonHttpMessageConverter() {
getObjectMapper().setSerializerFactory(getObjectMapper().getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
}
}
二、編寫MVC配置文件
接下來(lái)我們要寫一個(gè)MVC的配置類,繼承WebMvcConfigurationSupport類,并重寫configureMessageConverters()方法,在這里方法中,我們要把上面定義的Json轉(zhuǎn)換工具加載進(jìn)來(lái),來(lái)實(shí)現(xiàn)我們想要的功能。
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 MVC的配置類
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
// 文件映射路徑
@Value("${fileMappingPath}")
private String fileMappingPath;
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 返回給前端的json格式轉(zhuǎn)化器
*/
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new JacksonHttpMessageConverter());
}
}到目前為止,我們已經(jīng)實(shí)現(xiàn)了想要的功能,把String類型的null轉(zhuǎn)成"",把Integer類型的null轉(zhuǎn)成0,把空集合和數(shù)組轉(zhuǎn)成[]。
但是繼承WebMvcConfigurationSupport后,可能會(huì)出現(xiàn)一些坑,比如靜態(tài)資源獲取的問(wèn)題。
繼續(xù)往下看,沒(méi)準(zhǔn)可以防止埋雷。
三、防雷警告
繼承WebMvcConfigurationSupport類會(huì)使application.yml中配置的靜態(tài)資源映射失效,如果你在配置文件中配置了如下代碼
一定要警惕:
spring:
mvc:
static-path-pattern: /image/**
resources:
static-locations: file:E:/picture/當(dāng)我們繼承WebMvcConfigurationSupport類時(shí),會(huì)是配置文件的靜態(tài)資源映射失效,所以我們需要另一種解決方法,只需在WebMvcConfigurationSupport的子類中重寫addResourceHandlers()方法即可
如下所示:
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 MVC的配置類
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 返回給前端的json格式轉(zhuǎn)化器
*/
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new JacksonHttpMessageConverter());
}
// 文件映射路徑
@Value("${fileMappingPath}")
private String fileMappingPath;
/**
* @作者 yangs
* @日期 2022/1/20
* @描述 配置靜態(tài)資源訪問(wèn)路徑
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//通過(guò)image獲取靜態(tài)資源
registry.addResourceHandler("/image/**").addResourceLocations(fileMappingPath);
}
}
你也可以查看我的另一篇文章,查閱如何在SpringBoot中訪問(wèn)本地的靜態(tài)資源,SpringBoot訪問(wèn)本地靜態(tài)資源。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
POI通用導(dǎo)出Excel(.xls,.xlsx)的方法
這篇文章主要介紹了POI通用導(dǎo)出Excel(.xls,.xlsx)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法
文章介紹了在SpringBoot項(xiàng)目中使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的三種方式:基于注解、基于接口和基于注解設(shè)定多線程定時(shí)任務(wù),詳細(xì)講解了@Scheduled注解的使用方法、各個(gè)參數(shù)以及如何配置動(dòng)態(tài)定時(shí)任務(wù)和多線程定時(shí)任務(wù),感興趣的朋友一起看看吧2025-03-03
Spring MVC url提交參數(shù)和獲取參數(shù)
本文重要講述通過(guò)url提交參數(shù)和獲取參數(shù)的具體操作與實(shí)現(xiàn)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
搭建SpringBoot項(xiàng)目三種方式(圖文教程)
Springboot作為當(dāng)下最主流的java開(kāi)發(fā)框架,已成為IT從業(yè)人員的入門必備技能,本文主要介紹了搭建SpringBoot項(xiàng)目三種方式,感興趣的可以了解一下2023-09-09
Java中將String類型依照某個(gè)字符分割成數(shù)組的方法
下面小編就為大家分享一篇Java中將String類型依照某個(gè)字符分割成數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

