javascript
SpringMVC配置类WebMvcConfigurerAdapter学习总结
WebMvcConfigurerAdapter配置類是spring提供的一種配置方式,采用javabean的方式替代傳統的基于xml的配置來對spring框架進行自定義的配置。因此,在springboot提倡的基于注解的配置 && 采用約定大于配置的風格下,當需要進行自定義配置的時候,便可以繼承WebMvcConfigurerAdapter這個抽象類,通過javabean來實現需要的配置。
WebMvcConfigurerAdapter是一個抽象類,只提供一些空的接口讓用戶去重寫。其提供的接口如下:
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {/*配置路徑匹配參數*/public void configurePathMatch(PathMatchConfigurer configurer) {}/*配置Web Service或REST API設計中內容協商,即根據客戶端的支持內容格式情況來封裝響應消息體,如xml,json*/public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}/*配置路徑匹配參數*/public void configureAsyncSupport(AsyncSupportConfigurer configurer) {}/* 使得springmvc在接口層支持異步*/public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}/* 注冊參數轉換和格式化器*/public void addFormatters(FormatterRegistry registry) {}/* 注冊配置的攔截器*/public void addInterceptors(InterceptorRegistry registry) {}/* 自定義靜態資源映射*/public void addResourceHandlers(ResourceHandlerRegistry registry) {}/* cors跨域訪問*/public void addCorsMappings(CorsRegistry registry) {}/* 配置頁面直接訪問,不走接口*/public void addViewControllers(ViewControllerRegistry registry) {}/* 注冊自定義的視圖解析器*/public void configureViewResolvers(ViewResolverRegistry registry) {}/* 注冊自定義控制器(controller)方法參數類型*/public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}/* 注冊自定義控制器(controller)方法返回類型*/public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}/* 重載會覆蓋掉spring mvc默認注冊的多個HttpMessageConverter*/public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}/* 僅添加一個自定義的HttpMessageConverter,不覆蓋默認注冊的HttpMessageConverter*/public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}/* 注冊異常處理*/public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}/* 多個異常處理,可以重寫次方法指定處理順序等*/public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {} }使用WebMvcConfigurerAdapter提供的接口實現自定義配置項示例:
1、注冊攔截器
首先編寫攔截器類
public class LoginInterceptor extends HandlerInterceptorAdapter {private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//攔截器相關處理代碼logger.info("*********我是攔截器************");return true;} }自定義配置類繼承WebMvcConfigurerAdapter接口實現接口的addInterceptors方法來配制我們自定義的攔截器
@Configuration public class WebConfig extends WebMvcConfigurerAdapter {/** 攔截器配置*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");//注冊攔截器,并配置攔截路徑 }2.配置CORS跨域
只需要在上面的webConfig里重寫WebMvcConfigurerAdapter的addCorsMappings方法就可以獲得基于spring的跨域支持。
/*** 跨域CORS配置* @param registry*/@Overridepublic void addCorsMappings(CorsRegistry registry) {super.addCorsMappings(registry);registry.addMapping("/**").allowedHeaders("*").allowedMethods("POST","GET").allowedOrigins("http://...").allowCredentials(true);}3.配置ViewController
當首頁或者登陸頁的頁面對外暴露,不需要加載任何的配置的時候,這些頁面將不通過接口層,而是直接訪問,這時,就需要配置ViewController指定請求路徑直接到頁面。
/*** 視圖控制器配置* @param registry*/@Overridepublic void addViewControllers(ViewControllerRegistry registry) {super.addViewControllers(registry);registry.addViewController("/").setViewName("forward:/index.html");}4.配置Formatter
當請求的參數中帶有日期的參數的時候,可以在此配置formatter使得接收到日期參數格式統一
@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addFormatter(new Formatter<Date>() {@Overridepublic Date parse(String date, Locale locale) {return new Date(Long.parseLong(date));}@Overridepublic String print(Date date, Locale locale) {return Long.valueOf(date.getTime()).toString();}});}以上應用只適用于spring boot 2.0,Spring 5.0之前的版本,spring boot 2.0,Spring 5.0 以后WebMvcConfigurerAdapter會取消掉,高版本也提供了兩種解決方案:
方案1:直接實現WebMvcConfigurer
@Configuration public class WebMvcConfg implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/index").setViewName("index");}}方案2: 直接繼承WebMvcConfigurationSupport
@Configuration public class WebMvcConfg extends WebMvcConfigurationSupport {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/index").setViewName("index");}}其實,源碼下WebMvcConfigurerAdapter是實現WebMvcConfigurer接口,所以直接實現WebMvcConfigurer接口也可以;WebMvcConfigurationSupport與WebMvcConfigurerAdapter、接口WebMvcConfigurer處于同一個目錄下,WebMvcConfigurationSupport包含WebMvcConfigurer里面的方法,高版本中推薦使用WebMvcConfigurationSupport類,其實,源碼下WebMvcConfigurerAdapter是實現WebMvcConfigurer接口,所以直接實現WebMvcConfigurer接口也可以;WebMvcConfigurationSupport與WebMvcConfigurerAdapter、接口WebMvcConfigurer處于同一個目錄下,WebMvcConfigurationSupport包含WebMvcConfigurer里面的方法,高版本中推薦使用WebMvcConfigurationSupport類,其禁止了SpringBoot對mvc的自動配置,完全由用戶自己實現配置(不注意的話會遇到坑:springboot2.0、spring5.0 攔截器配置WebMvcConfigurerAdapter過時使用WebMvcConfigurationSupport來代替 新坑)。
參考資料:
Spring MVC 配置類 WebMvcConfigurerAdapter
spring boot攔截器WebMvcConfigurerAdapter,以及高版本的替換方案
@EnableWebMvc,WebMvcConfigurationSupport,WebMvcConfigurer和WebMvcConfigurationAdapter區別
總結
以上是生活随笔為你收集整理的SpringMVC配置类WebMvcConfigurerAdapter学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot对web应用的统一异
- 下一篇: SpringBoot项目打成jar包后,