欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot設(shè)置Json返回字段為非空問題

 更新時(shí)間:2024年08月09日 11:21:29   作者:小Y先生。  
這篇文章主要介紹了SpringBoot設(shè)置Json返回字段為非空問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

各位同學(xué)可能遇到過下述問題,在項(xiàng)目開發(fā)中,后端是以Json格式的數(shù)據(jù)返回給前端,但是對于數(shù)據(jù)為空的字段,可能出現(xiàn)NULL,這讓前端同學(xué)很痛苦,于是他們想,針對那些為null的字段,后端能不能把String類型的數(shù)據(jù)返回空字符串,int類型的數(shù)據(jù)返回0,集合和數(shù)組返回[],這樣多方便呢!

OK,既然這樣的話就滿足他們的要求,本文利用Spring自帶的Json轉(zhuǎn)化器,將返回給前端的數(shù)據(jù)進(jì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則注冊nullSerializer
                if (isArrayType(writer)) {
                    //給writer注冊一個(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配置文件

接下來我們要寫一個(gè)MVC的配置類,繼承WebMvcConfigurationSupport類,并重寫configureMessageConverters()方法,在這里方法中,我們要把上面定義的Json轉(zhuǎn)換工具加載進(jìn)來,來實(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)資源獲取的問題。

繼續(xù)往下看,沒準(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)資源訪問路徑
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //通過image獲取靜態(tài)資源
        registry.addResourceHandler("/image/**").addResourceLocations(fileMappingPath);
    }
}

你也可以查看我的另一篇文章,查閱如何在SpringBoot中訪問本地的靜態(tài)資源,SpringBoot訪問本地靜態(tài)資源

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳述IntelliJ IDEA插件的安裝及使用方法(圖解)

    詳述IntelliJ IDEA插件的安裝及使用方法(圖解)

    本篇文章主要介紹了詳述 IntelliJ IDEA 插件的安裝及使用方法(圖解),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java多線程學(xué)習(xí)筆記

    Java多線程學(xué)習(xí)筆記

    常用的實(shí)現(xiàn)多線程的兩種方式:Thread和Runnable。之所以說是“常用”,是因?yàn)樵贘ava 5后可以通過java.util.concurrent包中的線程池來實(shí)現(xiàn)多線程
    2021-09-09
  • POI通用導(dǎo)出Excel(.xls,.xlsx)的方法

    POI通用導(dǎo)出Excel(.xls,.xlsx)的方法

    這篇文章主要介紹了POI通用導(dǎo)出Excel(.xls,.xlsx)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 實(shí)例分析java對象的序列化和反序列化

    實(shí)例分析java對象的序列化和反序列化

    序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。一般將一個(gè)對象存儲(chǔ)至一個(gè)儲(chǔ)存媒介,例如檔案或是記億體緩沖等。在網(wǎng)絡(luò)傳輸過程中,可以是字節(jié)或是XML等格式。而字節(jié)的或XML編碼格式可以還原完全相等的對象。這個(gè)相反的過程又稱為反序列化
    2018-09-09
  • SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法

    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ù)

    Spring MVC url提交參數(shù)和獲取參數(shù)

    本文重要講述通過url提交參數(shù)和獲取參數(shù)的具體操作與實(shí)現(xiàn)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • Java中URL傳中文時(shí)亂碼的解決方法

    Java中URL傳中文時(shí)亂碼的解決方法

    為什么說亂碼是中國程序員無法避免的話題呢?這個(gè)主要是編碼機(jī)制上的原因,大家都知道中文和英文的編碼格式不一樣,解碼自然也不一樣!這篇文章就給大家分享了Java中URL傳中文時(shí)亂碼的解決方法,有需要的朋友們可以參考借鑒。
    2016-10-10
  • 搭建SpringBoot項(xiàng)目三種方式(圖文教程)

    搭建SpringBoot項(xiàng)目三種方式(圖文教程)

    Springboot作為當(dāng)下最主流的java開發(fā)框架,已成為IT從業(yè)人員的入門必備技能,本文主要介紹了搭建SpringBoot項(xiàng)目三種方式,感興趣的可以了解一下
    2023-09-09
  • SpringBoot之瘦身部署問題

    SpringBoot之瘦身部署問題

    這篇文章主要介紹了SpringBoot之瘦身部署問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java中將String類型依照某個(gè)字符分割成數(shù)組的方法

    Java中將String類型依照某個(gè)字符分割成數(shù)組的方法

    下面小編就為大家分享一篇Java中將String類型依照某個(gè)字符分割成數(shù)組的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論