統一的返回格式重要性就不用我說了吧,凡是有經驗的人都應該知道,
我們的數據有時候並不一定是豐滿的,比如我有一個用戶資料,賬號密碼肯定會有,但是暱稱,性別什麼的有時候卻沒有,將這類數據返回到前端的時候他們調用起來很有可能出現空指針異常,這種運行時異常需要在有特定數據的時候纔會發現,如果每一次我們都效驗一次的話會很麻煩,所以我們需要一個統一的視圖
下面來實際操作一下,這裏我們採用阿里巴巴的fastjson
首先,我們先引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
然後創建一個配置文件,具體代碼如下
package com.example.demo;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class Config implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//新建一個解析試圖
FastJsonHttpMessageConverter mFastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig FastJsonConfig = new FastJsonConfig();
FastJsonConfig.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullStringAsEmpty
);
mFastJsonHttpMessageConverter.setFastJsonConfig(FastJsonConfig);
//將試圖添加到列表內
converters.add(mFastJsonHttpMessageConverter);
}
}
@Configuration註解告訴springboot,這個文件是我們的配置文件
這裏我們實現了WebMvcConfigurer接口,這個接口是springboot內部提供專門處理用戶自行添加的配置,裏面不僅僅包含了修改視圖的過濾還有其他很多的方法,具體的以後再詳細說明,
除了實現這個接口以外還可以繼承自WebMvcConfigurationSupport 這個類
我們來看一下setSerializerFeatures這個方法的參數
這是一個枚舉,裏面有很多的東西,這裏我們只瞭解一下常用的,其他的有興趣大家可以自行了解
WriteMapNullValue:輸出map的時候,如果value是空的,則不顯示
WriteNullListAsEmpty:輸出list的時候如果是null則輸出長度爲0的數組
WriteNullStringAsEmpty:輸出string的時候,如果是null輸出空字符串
WriteNullNumberAsZero:輸出數值的時候,如果是null則輸出0
WriteNullBooleanAsFalse:輸出Boolean的時候,如實是null則輸出false
我們來測試一下這個類啊,首先我們添加一個javabean
這裏省略了get和set
我們在添加一個接口,
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoA {
@RequestMapping(value="testfalstjson")
public Atest testfalstjson(){
return new Atest();
}
}
然後我們看一下執行效果
可以看到,我們返回的是newAtest,a和b都應該是null,但現在不是,說明我們這裏配置成功了,
我們可以把之前那個類的內容註釋了再試試
package com.example.demo;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class Config implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//新建一個解析試圖
FastJsonHttpMessageConverter mFastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig FastJsonConfig = new FastJsonConfig();
FastJsonConfig.setSerializerFeatures(
// SerializerFeature.DisableCircularReferenceDetect,
// SerializerFeature.WriteNullNumberAsZero,
// SerializerFeature.WriteNullStringAsEmpty
);
mFastJsonHttpMessageConverter.setFastJsonConfig(FastJsonConfig);
//將試圖添加到列表內
converters.add(mFastJsonHttpMessageConverter);
}
}
到這裏的話就完全證明我們配置成功了,
當然,我們還可以自定義一個json試圖,不過比較麻煩,這裏我就不掩飾了
配套源碼:https://gitee.com/ww2510095/springboot_learning/tree/master