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,使框架能夠降低耦合度。
但對於追求完美的程式設計人員,這顯然無法令人滿意。於是出現了帶有預設實現的介面,這樣在使用的時候只需要實現自己想要的方法就行了,不用再去手動空實現或編寫介面卡。果然懶是第一創造力。
相關推薦
WebMvcConfigurationSupport、WebMvcConfigurerAdapter、WebMvcConfigurer
今天執行一個工程時候發現突然發現以前寫的Jackson配置全域性過濾值為null的欄位的類失效了。這個配置類程式碼如下: @Configuration public class JacksonConfig { @Bean @Primary
Spring MVC中WebMvcConfigurerAdapter、WebMvcConfigurationSupport與WebMvcConfigurer區別
最近參考書籍《Spring Boot實戰——Java EE開發的顛覆者》使用Spring Boot(2.0)搭建Spring MVC(5.0)專案進行配置時候,發現WebMvcConfigurerAdapter已過時檢視原始碼發現WebMvcConfigurerAdapter
(最短路徑算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理與介紹
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]表單控件、iframe、datails、meter、time、fieldset、mark
單選 spa 多行 普通 -html tag sel legend doctype 一、表單元素 1.input:空標記 屬性: type:文本框、密碼框、單選按鈕、復選框 value:當前表單元素的值,可以是提交給服務器的值,也可以是默認顯示的初始值 name:名稱,要提
malloc、calloc、realloc和alloca各種的區別
calloc 一次 單元 不支持 new span 初始化 har 堆棧 需要先包含頭文件 #include"malloc.h" malloc是標準的在堆中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(
getContextPath、getServletPath、getRequestURI的區別
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中使用Map、Set、List、數組、屬性集合的註入方法配置文件
查看 main list highlight 配置 spring配置 pla lec while (1)下邊的一個Java類包含了所有Map、Set、List、數組、屬性集合等這些容器,主要用於演示spring的註入配置; [java] view plain c
見刊編輯推薦《價值工程》期刊雜誌技術、經濟、管理、教育等多學科專業稿件都可以投
字符 數字 路徑 聯系電話 com 處理 施工 產生 企業 簡介: 《價值工程雜誌》雜誌。涉及技術、經濟、管理、教育等多學科,是多學科緊密結合、實施創新與優化的一門現代管理技術,而且還是一種重要的管理理念。價值工程的價值導向原則和創新本質、以及它的多學科化特性,將對科研創新
SQL、PL/SQL、DDL、DML、TCL介紹
mman pre clas str div red 我們 但是 efi SQL:結構化查詢語言(Structured Query Language) PL/SQL:過程化SQL語言(Procedural Language/SQL) DDL(Data Definit
List、Set、Map下各類型的對比
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安裝後沒有killall、ifconfig、命令補全
centos7從centos6 轉到centos7發現少了很多常用命令,下面就常見的幾個做一個說明解決辦法沒有killall命令:yum install -y psmisc沒有ifconfig命令:yum install -y net-tools沒有命令補全: yum install -y bash-com
(轉載)display:inline、block、inline-block的區別
order label doc class 先後 padding str 如何實現 col display:block就是將元素顯示為塊級元素. block元素的特點是: 總是在新行上開始; 高度,行高以及頂和底邊距都可控制; 寬度缺省是它的容器的100
ODR、EIGRP、OSPF、BGP、PPPOE、IPV6
interface router protocol enable detail CDP、ODR 全局是cdp run接口是cdp enable#show cdp neighbors 可以加detail#clear cdp table 清空cdpconf#router odr 開啟ODR