1. 程式人生 > >WebMvcConfigurationSupport、WebMvcConfigurerAdapter、WebMvcConfigurer

WebMvcConfigurationSupport、WebMvcConfigurerAdapter、WebMvcConfigurer

今天執行一個工程時候發現突然發現以前寫的Jackson配置全域性過濾值為null的欄位的類失效了。這個配置類程式碼如下:

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false
).build(); // 通過該方法對mapper物件進行設定,所有序列化的物件都將按改規則進行系列化 // Include.Include.ALWAYS 預設 // Include.NON_DEFAULT 屬性為預設值不序列化 // Include.NON_EMPTY 屬性為 空("") 或者為 NULL 都不序列化,則返回的json是沒有這個欄位的。這樣對移動端會更省流量 // Include.NON_NULL 屬性為NULL 不序列化,就是為null的欄位不參加序列化 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 欄位保留,將null值轉為""
// objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { // @Override // public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { // jsonGenerator.writeString("");
// } // }); return objectMapper; } }

排查了半天發現是因為之前將spring boot工程由1.5.10.RELEASE升級到了2.0.1RELEASE,然後IDEA提示攔截器繼承的WebMvcConfigurerAdapter類是過時的,就換成了WebMvcConfigurationSupport。改回WebMvcConfigurerAdapter就有效了。非常納悶於是去網上查了查,大部分都是這樣的說明,詳見[https://blog.csdn.net/lqadam/article/details/80637335 ]

[email protected]=WebMvcConfigurationSupport,使用了@EnableWebMvc註解等於擴充套件了WebMvcConfigurationSupport但是沒有重寫任何方法
[email protected]+extends WebMvcConfigurationAdapter,在擴充套件的類中重寫父類的方法即可,這種方式會遮蔽springboot的@EnableAutoConfiguration中的設定
3.extends WebMvcConfigurationSupport,在擴充套件的類中重寫父類的方法即可,這種方式會遮蔽springboot的@EnableAutoConfiguration中的設定
4.extends WebMvcConfigurationAdapter,在擴充套件的類中重寫父類的方法即可,這種方式依舊使用springboot的@EnableAutoConfiguration中的設定

很是不解既然預設配置不是spring boot的一大特色嗎,那為什麼還有WebMvcConfigurationSupport這種東西。
可能是瞭解的太少吧,留著這個疑惑慢慢思考,先解決當前的問題。過時的WebMvcConfigurerAdapter帶著刺眼的橫線,這無疑會汙染我的程式碼,影響編碼心情。
檢視WebMvcConfigurationAdapter原始碼,Doc規範告訴我們過時類都會在原始碼註釋中給出推薦使用的替代類。果然發現以下說明:

/**
 * An implementation of {@link WebMvcConfigurer} with empty methods allowing
 * subclasses to override only the methods they're interested in.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 * @deprecated as of 5.0 {@link WebMvcConfigurer} has default methods (made
 * possible by a Java 8 baseline) and can be implemented directly without the
 * need for this adapter
 */
 @Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
...
}

意思就是Java8給出了新的特性,使得介面方法可以擁有預設實現。所以你現在可以直接實現WebMvcConfigurer而不用像以前那樣通過繼承它的實現類來達到目的。
OK,文件說的很明白了,換成實現WebMvcConfigurer方式確實解決了問題。

不過新的疑問又出來了,為什麼Java8要弄個介面預設方法呢,這有什麼特別的地方嗎?這個倒是很容易想明白。進入WebMvcConfigurer類檢視原始碼,可以發現其中定義了大量的方法。與WebMvcConfigurerAdapter進行對比可以發現,雖然WebMvcConfigurerAdapter實現了WebMvcConfigurer介面,但是大量的實現都是空實現啊。。。

 ...
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

    /**
     * {@inheritDoc}
     * <p>This implementation is empty.
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    }

    /**
     * {@inheritDoc}
     * <p>This implementation is empty.
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    }

    /**
     * {@inheritDoc}
     * <p>This implementation is empty.
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    }
...

做成這樣是因為Java的單繼承多實現規則,一個類可能同時需要WebMvcConfigurer和其他類中的方法,用繼承的方式限制了這一點。而WebMvcConfigurer中的方法也不是在每個地方都會用到,所以寫了一些特定場合的適配,這樣就可以按需繼承對應的介面卡,而自己的定製實現通過多型性對外展示為WebMvcConfigurer,使框架能夠降低耦合度。
但對於追求完美的程式設計人員,這顯然無法令人滿意。於是出現了帶有預設實現的介面,這樣在使用的時候只需要實現自己想要的方法就行了,不用再去手動空實現或編寫介面卡。果然懶是第一創造力。

相關推薦

WebMvcConfigurationSupportWebMvcConfigurerAdapterWebMvcConfigurer

今天執行一個工程時候發現突然發現以前寫的Jackson配置全域性過濾值為null的欄位的類失效了。這個配置類程式碼如下: @Configuration public class JacksonConfig { @Bean @Primary

Spring MVC中WebMvcConfigurerAdapterWebMvcConfigurationSupportWebMvcConfigurer區別

最近參考書籍《Spring Boot實戰——Java EE開發的顛覆者》使用Spring Boot(2.0)搭建Spring MVC(5.0)專案進行配置時候,發現WebMvcConfigurerAdapter已過時檢視原始碼發現WebMvcConfigurerAdapter

(最短路徑算法整理)dijkstrafloydbellman-fordspfa算法模板的整理與介紹

void empty borde fast 默認 grand else 理解 scan 這一篇博客以一些OJ上的題目為載體。整理一下最短路徑算法。會陸續的更新。。。 一、多源最短路算法——floyd算法 floyd算法主要用於求隨意兩點間的最短路徑。也成

sql 實現用戶名郵箱手機號登錄

append nes class select logs lec email mobile () StringBuilder strSql = new StringBuilder(); strSql.Append("se

8.1 加減日

加減 val nth ear edate tno minus date bsp select hiredate - interval 5 day as hd_minus_5D, hiredate + interval 5 day as hd_

[HTML]表單控件iframedatailsmetertimefieldsetmark

單選 spa 多行 普通 -html tag sel legend doctype 一、表單元素 1.input:空標記 屬性: type:文本框、密碼框、單選按鈕、復選框 value:當前表單元素的值,可以是提交給服務器的值,也可以是默認顯示的初始值 name:名稱,要提

malloccallocrealloc和alloca各種的區別

calloc 一次 單元 不支持 new span 初始化 har 堆棧 需要先包含頭文件 #include"malloc.h" malloc是標準的在堆中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(

getContextPathgetServletPathgetRequestURI的區別

request 執行 result web print 名稱 ati 輸入 pri 假定你的web application名稱為example,你在瀏覽器中輸入請求路徑: https://localhost:8080/example/main/edit.jsp 則執行

Linux存儲管理及硬盤分區格式化掛載

硬盤接口 mknod fdisk 下面介紹的是Linux的存儲管理基礎知識、使用一個新的硬盤設備步驟為(分區、格式化、掛載分區)。一、Linux的存儲管理基礎知識點1、硬件組成計算機基礎知識中,各個硬件表示為:運算器(CUP);控制器(MEEM);硬盤(HDisk);網卡(NIC,即net int

Spring中使用MapSetList數組屬性集合的註入方法配置文件

查看 main list highlight 配置 spring配置 pla lec while (1)下邊的一個Java類包含了所有Map、Set、List、數組、屬性集合等這些容器,主要用於演示spring的註入配置; [java] view plain c

見刊編輯推薦《價值工程》期刊雜誌技術經濟管理教育等多學科專業稿件都可以投

字符 數字 路徑 聯系電話 com 處理 施工 產生 企業 簡介: 《價值工程雜誌》雜誌。涉及技術、經濟、管理、教育等多學科,是多學科緊密結合、實施創新與優化的一門現代管理技術,而且還是一種重要的管理理念。價值工程的價值導向原則和創新本質、以及它的多學科化特性,將對科研創新

SQLPL/SQLDDLDMLTCL介紹

mman pre clas str div red 我們 但是 efi SQL:結構化查詢語言(Structured Query Language) PL/SQL:過程化SQL語言(Procedural Language/SQL) DDL(Data Definit

ListSetMap下各類型的對比

hashtable class ray hashmap 速查 使用 線程同步 highlight ash 1.List和Set: List: 元素有放入順序,元素可重復,查找效率高,插入刪除效率低; Set: 元素無放入順序,元素不可重復,(元素雖然無順序,但元素在Set

獲取選擇的當前天年的時間段

日期格式化 sta ret date fwe 設置 .info || ted /** * Created by Administrator on 2017/5/6. */ /** * options:{"type":2,"date":"2017-5-6","conn

Oracle12c多租戶管理用戶角色權限

ota table logo 本地 emp 滿足 pdb 不可見 常見 Oracle 數據庫 12 c 多租戶選項允許單個容器數據庫 (CDB) 來承載多個單獨的可插拔數據庫 (PDB)。那麽我們如何在容器數據庫 (CDB) 和可插拔數據庫 (PDB)管理用戶權限。背景:當

linux環境下部署zabbix3.2模板郵件告警詳細過程

-1 ice erer without zlib zip ever native item 服務端部署: 系統環境及軟件版本: Linux:release 6.3 zabbix:zabbix-3.2.5.tar.gz nginx:nginx-1.12.0.tar.gz ph

Qt入門之基礎篇 ( 二 ) :Qt項目建立編譯運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

解決CentOS 7安裝後沒有killallifconfig命令補全

centos7從centos6 轉到centos7發現少了很多常用命令,下面就常見的幾個做一個說明解決辦法沒有killall命令:yum install -y psmisc沒有ifconfig命令:yum install -y net-tools沒有命令補全: yum install -y bash-com

(轉載)display:inlineblockinline-block的區別

order label doc class 先後 padding str 如何實現 col display:block就是將元素顯示為塊級元素.   block元素的特點是:  總是在新行上開始;  高度,行高以及頂和底邊距都可控制;  寬度缺省是它的容器的100

ODREIGRPOSPFBGPPPPOEIPV6

interface router protocol enable detail CDP、ODR 全局是cdp run接口是cdp enable#show cdp neighbors 可以加detail#clear cdp table 清空cdpconf#router odr 開啟ODR