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