在本文中,將介紹將spring 4.xx(或者更低)版本升級到Spring 5.xx以及將Spring Boot 1.xx版本升級到Spring Boot 2.xx版本後會報的一個嚴重警告:"Warning:The type WebMvcConfigurerAdapter is deprecated." ,以及快速的分析產生這個嚴重警告的緣由和處理辦法。html
若是咱們使用Spring 5.xx(或者Spring Boot 2.xx)版原本構建或者升級應用程序,在配置WebMvc時,則會出現此警告,這是由於在早期的Spring版本中,若是要配置Web應用程序,能夠經過擴展WebMvcConfigurerAdapter類快熟實現配置,大體代碼以下:java
package com.ramostear.page; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Spring 4(或者Spring Boot 1.x)版本配置Web應用程序示例 * @author ramostear * @create-time 2019/4/18 0018-1:38 */ @Configuration public class OldMvcConfig extends WebMvcConfigurerAdapter{ @Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/META-INF/resources/") .addResourceLocations("classpath:/public/") .addResourceLocations("classpath:/resources/"); super.addResourceHandlers(registry); } } 複製代碼
WebMvcConfigurerAdapter 是一個實現了WebMvcConfigurer 接口的抽象類,並提供了所有方法的空實現,咱們能夠在其子類中覆蓋這些方法,以實現咱們本身的配置,如視圖解析器,攔截器和跨域支持等...,因爲Java的版本更新,在Java 8中,能夠使用default關鍵詞爲接口添加默認的方法,Spring在升級的過程當中也同步支持了Java 8中這一新特性。下面是在Java 8 中給接口定義一個默認方法的簡單實現:web
public interface MyInterface{ default void sayHello(){ //... } void sayName(){} String writeName(){} //... } 複製代碼
如前面所述,從Spring 5開始,WebMvcConfigure接口包含了WebMvcConfigurerAdapter類中全部方法的默認實現,所以WebMvcConfigurerAdapter這個適配器就被打入冷宮了,下面是WebMvcConfigurerAdapter類部分源碼示例:spring
/** * 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 { /** * {@inheritDoc} * <p>This implementation is empty. */ @Override public void configurePathMatch(PathMatchConfigurer configurer) { } /** * {@inheritDoc} * <p>This implementation is empty. */ @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } ... } 複製代碼
趣味提示:咱們能夠經過實現WebMvcConfigure接口中的方法來配置Web應用程序,而不須要讓WebMvcConfigurerAdapter這個中間商 賺差價。編程
如此這般,咱們找到了一個消除警告的方法:直接實現WebMvcConfigurer接口。在咱們準備與WebMvcConfigurer打交道以前,先看看此接口的基本狀況:跨域
public interface WebMvcConfigurer { default void configurePathMatch(PathMatchConfigurer configurer) { } /** * Configure content negotiation options. */ default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } /** * Configure asynchronous request handling options. */ default void configureAsyncSupport(AsyncSupportConfigurer configurer) { } ... } 複製代碼
如今,咱們就能夠動手配置Web應用程序了,大體的代碼以下:markdown
/** * Spring 5 (或者Spring Boot 2.x)版本配置Web應用程序示例 * @author ramostear * @create-time 2019/4/18 0018-1:40 */ @Configuration public class MvcConfigure implements WebMvcConfigurer{ @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/public/") .addResourceLocations("classpath:/resources/"); } } 複製代碼
就這樣簡單地將警告消除了,將原來的繼承WebMvcConfigurerAdapter類改成實現WebMvcConfigurer接口,其他的地方都沒有變化。但有一點須要注意,若是你是升級舊有的應用程序,須要將方法中對super()的調用代碼清除。mvc
至此,咱們的程序又能夠愉快的玩耍了。那麼,除了消除中間商 賺差價的方式來規避警告外,還有沒有其餘的途徑呢?答案固然是確定的。咱們除了消除中間商從WebMvcConfigurer中得到配置Web應用程序的途徑外,還能夠直接從WebMvcConfigurationSupport這個配置「供應商「的手中獲取配置途徑。WebMvcConfigurationSupport是一個提供了以Java編程方式來配置Web應用程序的配置主類,因此咱們能夠從這個配置供應商的手中獲取Web應用程序的配置方式。方法很簡單,只須要擴展此類並重寫對應的方法便可。和上面的方式同樣,咱們先看看此類的內部大體結構:app
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { ... /** * Provide access to the shared handler interceptors used to configure * {@link HandlerMapping} instances with. * <p>This method cannot be overridden; use {@link #addInterceptors} instead. */ protected final Object[] getInterceptors() { ... } /** * Return a handler mapping ordered at Integer.MAX_VALUE-1 with mapped * resource handlers. To configure resource handling, override * {@link #addResourceHandlers}. */ @Bean @Nullable public HandlerMapping resourceHandlerMapping() { ... handlerMapping.setPathMatcher(mvcPathMatcher()); handlerMapping.setUrlPathHelper(mvcUrlPathHelper()); handlerMapping.setInterceptors(getInterceptors()); handlerMapping.setCorsConfigurations(getCorsConfigurations()); return handlerMapping; } } 複製代碼
是否是看到很熟悉的東西,有攔截器,靜態資源映射等等...,如今咱們只須要擴展此類並重寫其中的方法,就能夠配置咱們的Web應用程序(還須要使用@Configuration對擴展類進行註釋),示例代碼以下:async
/** * 消除警告的第二種配置選擇 * @author ramostear * @create-time 2019/4/7 0007-4:10 */ @Configuration public class MvcConfig extends WebMvcConfigurationSupport { @Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/META-INF/resources/") .addResourceLocations("classpath:/public/") .addResourceLocations("classpath:/resources/"); super.addResourceHandlers(registry); } } 複製代碼
在本文中,經過快速的梳理,給出了兩種不一樣的方案來消除因爲升級Spring(或者Spring Boot)版本所帶來的WebMvcConfigurerAdapter類被棄用的嚴重警告。本次技術分享到這裏就結束了,感謝你耐心的閱讀。若是你在遇到一樣問題時還有更好的解決方案,能夠在下方的評論區給我留言。
原文做者:譚朝紅 原文標題:WEBMVCCONFIGURERADAPTER被棄用後的兩個選擇