成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

spring boot 集成swagger并且使用攔截器的配置問題

fsmStudy / 3114人閱讀

摘要:另外的解決方案網(wǎng)上還有另外一種說法,可以實(shí)現(xiàn)接口,代碼如下用于添加攔截規(guī)則,先把所有路徑都加入攔截,再一個(gè)個(gè)排除自定義規(guī)則,如果遇到,則把泛型類轉(zhuǎn)成通用服務(wù)易??萍嫉沁@種配置想要生效,必須加注解,不然不起作用。

最近同事問我,spring boot集成了swagger,但是在使用攔截器的時(shí)候遇到了問題,頁面無法訪問。經(jīng)過研究解決了這個(gè)問題。

配置問題解決

集成swagger就不啰嗦了,網(wǎng)上到處都是,直接看配置。

同事從網(wǎng)上找到的配置:

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( //自定義規(guī)則,如果遇到DeferredResult,則把泛型類轉(zhuǎn)成json
                        newRule(typeResolver.resolve(DeferredResult.class,
                                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                                typeResolver.resolve(WildcardType.class)))
                ;
    }

    private ApiInfo metaData() {
        return new ApiInfoBuilder()
                .title("通用服務(wù) 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);
    }
}

這是他從網(wǎng)上找到的攔截器的配置:

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new LoginInterceptor())
                // addPathPatterns 用于添加攔截規(guī)則 , 先把所有路徑都加入攔截, 再一個(gè)個(gè)排除
                .addPathPatterns("/**")
                .excludePathPatterns(Collections.singletonList("/swagger-ui.html"));
        super.addInterceptors(registry);
    }

}

現(xiàn)在的測試結(jié)果就是,打開http://host:port/path/swagger-ui.html,就是一個(gè)空白頁面,無法使用,現(xiàn)在要解決的就是這個(gè)問題。

打開谷歌瀏覽器的調(diào)試控制臺(tái),查看network,如圖:

可以明顯看出,頁面加載數(shù)據(jù)的時(shí)候,并沒有報(bào)什么錯(cuò)誤,只是加載的資源都被攔截器攔截了,無法加載資源,可想而知,資源都被攔截器攔截了。

我分析了一下,加載資源的路徑,修改了一下攔截器資源配置:

 @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                // addPathPatterns 用于添加攔截規(guī)則 , 先把所有路徑都加入攔截, 再一個(gè)個(gè)排除
                .addPathPatterns("/**")
                .excludePathPatterns("/swagger-ui.html")
                .excludePathPatterns("/swagger-resources/**")
                .excludePathPatterns("/error")
                .excludePathPatterns("/webjars/**");
    }

另外兩個(gè)類實(shí)際是同一個(gè)作用,所以合并兩個(gè)類:

@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 用于添加攔截規(guī)則 , 先把所有路徑都加入攔截, 再一個(gè)個(gè)排除
                .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( //自定義規(guī)則,如果遇到DeferredResult,則把泛型類轉(zhuǎn)成json
                        newRule(typeResolver.resolve(DeferredResult.class,
                                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                                typeResolver.resolve(WildcardType.class)))
                ;
    }

    private ApiInfo metaData() {
        return new ApiInfoBuilder()
                .title("通用服務(wù) 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();
    }
}

這樣就沒有問題了。

另外的解決方案

網(wǎng)上還有另外一種說法,可以實(shí)現(xiàn)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) {

        List excludePathPatterns = new ArrayList<>();
        excludePathPatterns.add("/swagger-ui.html");
        excludePathPatterns.add("/swagger-resources/**");
        excludePathPatterns.add("/error");
        excludePathPatterns.add("/webjars/**");

        // addPathPatterns 用于添加攔截規(guī)則 , 先把所有路徑都加入攔截, 再一個(gè)個(gè)排除
        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( //自定義規(guī)則,如果遇到DeferredResult,則把泛型類轉(zhuǎn)成json
                        newRule(typeResolver.resolve(DeferredResult.class,
                                typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                                typeResolver.resolve(WildcardType.class)))
                ;
    }


    private ApiInfo metaData() {
        return new ApiInfoBuilder()
                .title("通用服務(wù) 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 定義回調(diào)方法。
@EnableWebMVC帶注釋的配置類可以實(shí)現(xiàn)這個(gè)接口自定義默認(rèn)配置。

當(dāng)然如果你覺得自己的配置沒問題,但是仍然不起作用,這時(shí)候該怎么辦?請按照一下步驟debug:
1、找到InterceptorRegistration類;
2、找到addInterceptor方法和excludePathPatterns方法,打上斷點(diǎn);
3、debug模式啟動(dòng)項(xiàng)目;

如果沒有進(jìn)入斷點(diǎn),那就說明你的配置根本沒有起到作用,看看注解是否沒寫。

如果進(jìn)入了斷點(diǎn),就要看看斷點(diǎn)處傳進(jìn)來的參數(shù)是否是你配置的參數(shù),不是那就是有問題,這時(shí)候再根據(jù)參數(shù)查找問題。

這樣基本就能解決問題了。

總結(jié)

網(wǎng)上很多東西都是抄來抄去,也不知道有沒有驗(yàn)證,讓很多人摸不著頭腦。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74168.html

相關(guān)文章

  • ApiBoot - ApiBoot Security Oauth 依賴使用文檔

    摘要:如果全部使用默認(rèn)值的情況話不需要做任何配置方式前提項(xiàng)目需要添加數(shù)據(jù)源依賴。獲取通過獲取啟用在使用格式化時(shí)非常簡單的,配置如下所示開啟轉(zhuǎn)換轉(zhuǎn)換時(shí)所需加密,默認(rèn)為恒宇少年于起宇默認(rèn)不啟用,簽名建議進(jìn)行更換。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴(kuò)展、自動(dòng)化完成配置,讓接口開發(fā)者可以選著性完成開箱即...

    Tonny 評論0 收藏0
  • Java | Spring Boot Swagger2 集成REST ful API 生成接口文檔

    摘要:集成生成接口文檔原文簡介由于的特性,用來開發(fā)變得非常容易,并且結(jié)合來自動(dòng)生成文檔變得方便快捷。使用生成,我們可以得到交互式文檔。聽過與的結(jié)合,生成更加完備的文檔。接下來將基于與搭建完整的文檔系統(tǒng)。 Spring Boot Swagger2 集成REST ful API 生成接口文檔 原文 簡介 由于Spring Boot 的特性,用來開發(fā) REST ful 變得非常容易,并且結(jié)合 Sw...

    joyvw 評論0 收藏0
  • SpringCloud核心教程 | 第四篇:服務(wù)注冊與發(fā)現(xiàn) Consul篇

    摘要:下一篇介紹基于的服務(wù)注冊與調(diào)用。服務(wù)提供者工程配置這里服務(wù)提供者是使用之前進(jìn)階教程第三篇整合連接池以及監(jiān)控改造而來,這里一樣的部分就不再重復(fù)說明,下面將說明新增的部分。 Spring Cloud簡介 Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具,它為基于JVM的云應(yīng)用開發(fā)中涉及的配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分...

    Xufc 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<