Spring Boot 整合Swagger中的坑
目錄
一、訪問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);
}