摘要:另外的解決方案網上還有另外一種說法,可以實現接口,代碼如下用于添加攔截規則,先把所有路徑都加入攔截,再一個個排除自定義規則,如果遇到,則把泛型類轉成通用服務易保科技但是這種配置想要生效,必須加注解,不然不起作用。
最近同事問我,spring boot集成了swagger,但是在使用攔截器的時候遇到了問題,頁面無法訪問。經過研究解決了這個問題。
配置問題解決集成swagger就不啰嗦了,網上到處都是,直接看配置。
同事從網上找到的配置:
import com.xxx.xxxx.xxx.xxx.LoginInterceptor; import com.fasterxml.classmate.TypeResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.WildcardType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.Collections; import static springfox.documentation.schema.AlternateTypeRules.newRule; @Configuration @EnableSwagger2 public class Swagger2Config extends WebMvcConfigurationSupport { @Autowired private TypeResolver typeResolver; @Bean public Docket productApi() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.xxx.xxx.controller")) .paths(PathSelectors.any()) .build() .apiInfo(metaData()) .alternateTypeRules( //自定義規則,如果遇到DeferredResult,則把泛型類轉成json newRule(typeResolver.resolve(DeferredResult.class, typeResolver.resolve(ResponseEntity.class, WildcardType.class)), typeResolver.resolve(WildcardType.class))) ; } private ApiInfo metaData() { return new ApiInfoBuilder() .title("通用服務 APIs") /*.description(""REST API for Online Store"")*/ .version("1.0.0") /* .license("Apache License Version 2.0") .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0"")*/ .contact(new Contact("易??萍?, "", "mail@mail")) .build(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); super.addResourceHandlers(registry); } }
這是他從網上找到的攔截器的配置:
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) // addPathPatterns 用于添加攔截規則 , 先把所有路徑都加入攔截, 再一個個排除 .addPathPatterns("/**") .excludePathPatterns(Collections.singletonList("/swagger-ui.html")); super.addInterceptors(registry); } }
現在的測試結果就是,打開http://host:port/path/swagger-ui.html,就是一個空白頁面,無法使用,現在要解決的就是這個問題。
打開谷歌瀏覽器的調試控制臺,查看network,如圖:
可以明顯看出,頁面加載數據的時候,并沒有報什么錯誤,只是加載的資源都被攔截器攔截了,無法加載資源,可想而知,資源都被攔截器攔截了。
我分析了一下,加載資源的路徑,修改了一下攔截器資源配置:
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) // addPathPatterns 用于添加攔截規則 , 先把所有路徑都加入攔截, 再一個個排除 .addPathPatterns("/**") .excludePathPatterns("/swagger-ui.html") .excludePathPatterns("/swagger-resources/**") .excludePathPatterns("/error") .excludePathPatterns("/webjars/**"); }
另外兩個類實際是同一個作用,所以合并兩個類:
@Configuration @EnableSwagger2 public class TestMVCConfig extends WebMvcConfigurationSupport { @Resource private TypeResolver typeResolver; @Resource private LoginInterceptor loginInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) // addPathPatterns 用于添加攔截規則 , 先把所有路徑都加入攔截, 再一個個排除 .addPathPatterns("/**") .excludePathPatterns("/swagger-ui.html") .excludePathPatterns("/swagger-resources/**") .excludePathPatterns("/error") .excludePathPatterns("/webjars/**"); } @Bean public Docket productApi() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.xxx.xxx.controller")) .paths(PathSelectors.any()) .build() .apiInfo(metaData()) .alternateTypeRules( //自定義規則,如果遇到DeferredResult,則把泛型類轉成json newRule(typeResolver.resolve(DeferredResult.class, typeResolver.resolve(ResponseEntity.class, WildcardType.class)), typeResolver.resolve(WildcardType.class))) ; } private ApiInfo metaData() { return new ApiInfoBuilder() .title("通用服務 APIs") /*.description(""REST API for Online Store"")*/ .version("1.0.0") /* .license("Apache License Version 2.0") .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0"")*/ .contact(new Contact("易??萍?, "", "mail@mail")) .build(); } }
這樣就沒有問題了。
另外的解決方案網上還有另外一種說法,可以實現WebMvcConfigurer接口,代碼如下:
@Configuration @EnableWebMvc @EnableSwagger2 public class WebMVCConfig implements WebMvcConfigurer{ @Resource private TypeResolver typeResolver; @Resource private LoginInterceptor loginInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } @Override public void addInterceptors(InterceptorRegistry registry) { ListexcludePathPatterns = new ArrayList<>(); excludePathPatterns.add("/swagger-ui.html"); excludePathPatterns.add("/swagger-resources/**"); excludePathPatterns.add("/error"); excludePathPatterns.add("/webjars/**"); // addPathPatterns 用于添加攔截規則 , 先把所有路徑都加入攔截, 再一個個排除 registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns(excludePathPatterns); } @Bean public Docket productApi() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.xx.sss.controller")) .paths(PathSelectors.any()) .build() .apiInfo(metaData()) .alternateTypeRules( //自定義規則,如果遇到DeferredResult,則把泛型類轉成json newRule(typeResolver.resolve(DeferredResult.class, typeResolver.resolve(ResponseEntity.class, WildcardType.class)), typeResolver.resolve(WildcardType.class))) ; } private ApiInfo metaData() { return new ApiInfoBuilder() .title("通用服務 APIs") /*.description(""REST API for Online Store"")*/ .version("1.0.0") /* .license("Apache License Version 2.0") .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0"")*/ .contact(new Contact("易??萍?, "", "mail@mail")) .build(); } }
但是這種配置想要生效,必須加@EnableWebMvc注解,不然不起作用。為什么?
官方源碼注釋:
/** * Defines callback methods to customize the Java-based configuration for * Spring MVC enabled via {@code @EnableWebMvc}. * *{@code @EnableWebMvc}-annotated configuration classes may implement * this interface to be called back and given a chance to customize the * default configuration. *
通過@enableWebMVC啟用Spring MVC,自定義基于Java config 定義回調方法。 @EnableWebMVC帶注釋的配置類可以實現這個接口自定義默認配置。
當然如果你覺得自己的配置沒問題,但是仍然不起作用,這時候該怎么辦?請按照一下步驟debug:
1、找到InterceptorRegistration類;
2、找到addInterceptor方法和excludePathPatterns方法,打上斷點;
3、debug模式啟動項目;
如果沒有進入斷點,那就說明你的配置根本沒有起到作用,看看注解是否沒寫。
如果進入了斷點,就要看看斷點處傳進來的參數是否是你配置的參數,不是那就是有問題,這時候再根據參數查找問題。
這樣基本就能解決問題了。
總結網上很多東西都是抄來抄去,也不知道有沒有驗證,讓很多人摸不著頭腦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74168.html
摘要:如果全部使用默認值的情況話不需要做任何配置方式前提項目需要添加數據源依賴。獲取通過獲取啟用在使用格式化時非常簡單的,配置如下所示開啟轉換轉換時所需加密,默認為恒宇少年于起宇默認不啟用,簽名建議進行更換。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務集成基礎框架, 內部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發者可以選著性完成開箱即...
摘要:集成生成接口文檔原文簡介由于的特性,用來開發變得非常容易,并且結合來自動生成文檔變得方便快捷。使用生成,我們可以得到交互式文檔。聽過與的結合,生成更加完備的文檔。接下來將基于與搭建完整的文檔系統。 Spring Boot Swagger2 集成REST ful API 生成接口文檔 原文 簡介 由于Spring Boot 的特性,用來開發 REST ful 變得非常容易,并且結合 Sw...
摘要:下一篇介紹基于的服務注冊與調用。服務提供者工程配置這里服務提供者是使用之前進階教程第三篇整合連接池以及監控改造而來,這里一樣的部分就不再重復說明,下面將說明新增的部分。 Spring Cloud簡介 Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分...
閱讀 3331·2021-11-25 09:43
閱讀 3015·2021-10-15 09:43
閱讀 1971·2021-09-08 09:36
閱讀 2923·2019-08-30 15:56
閱讀 747·2019-08-30 15:54
閱讀 2690·2019-08-30 15:54
閱讀 2978·2019-08-30 11:26
閱讀 1250·2019-08-29 17:27