1. 程式人生 > >Spring Boot 整合Swagger中的坑

Spring Boot 整合Swagger中的坑

目錄

一、訪問swagger-ui.hyml頁面出錯

1.1 情況1

1.2 情況2

二、無法載入swagger-ui.html頁面中的靜態資源

三、出現彈窗,無法訪問

四、總結


一、訪問swagger-ui.hyml頁面出錯

1.1 情況1

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:428) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]

2018-10-28 16:32:04.295  INFO 96428 --- [nio-8089-exec-9] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:428) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.32.jar:8.5.32]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]

請求頭的問題,不要用https訪問,用http。

1.2 情況2

返回401,未授權。因為訂單服務配置了攔截器,來獲取使用者資訊,所以會攔截所有訪問該埠的請求,當訪問swagger-ui時直接將請求傳送到了controller中,導致訪問失敗。

具體看攔截器配置:

攔截所有根目錄下的請求,根據閘道器的配置可以得到,訪問訂單微服務的url為:http://api.leyou.com/api/order/

所以此時如果訪問swagger-ui時,使用的路徑為:http://localhost:8089/swagger-ui.html ,這裡面的前半部分:http://localhost:8089就相當於http://api.leyou.com/api/order/(通過nginx反向代理),所以為了區分訪問路徑,在閘道器配置中就不指定order字首了,將其放在controller中進行配置。

這樣配置完成後,進入controller時就必須帶字首order了,但是此時訪問還是會造成401錯誤,因為配置了攔截器,訪問根目錄下的所有路徑都會進行使用者是否登入的檢測,所以在攔截器中將訪問swagger-ui的路徑過濾掉:

再次訪問http://localhost:8089/swagger-ui.html就不會被轉發到controller中引發401錯誤了。

注意,引發401錯誤的可能還註解:@EnableWebMvc。

後期在處理Long型別資料以json形式返回時的問題,會配置一個轉換器,要用到這個註解。在進行介面測試時將其註釋掉。

二、無法載入swagger-ui.html頁面中的靜態資源

通過第一步的修改後,可以訪問頁面,但是頁面空白。

開啟控制檯,重新整理頁面:

發現靜態資源無法載入,同樣,還是因為攔截器的原因。

具體檢視靜態資源,會發現它們都在一個webjars的路徑下,那麼直接過濾掉這個路徑即可:

效果:

靜態資源都載入成功,但是又有新的問題

三、出現彈窗,無法訪問

點擊發生錯誤的請求:

發現產生這個問題的原因是無法載入swagger的資原始檔,還是因為攔截器的問題,那麼過濾掉即可:

最後結果:

四、總結

無法訪問swagger-ui最主要的原因都是攔截器的問題(如果配置了的話)

攔截器程式碼:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        List<String> excludePath = new ArrayList<>();
        excludePath.add("/swagger-ui.html");
        excludePath.add("/swagger-resources/**");
        excludePath.add("/webjars/**");
        
        registry.addInterceptor(loginInterceptor())
                .addPathPatterns("/**").excludePathPatterns(excludePath);
    }