本文目錄
一、背景描述
二、問題原因
2.1 為什麼會報錯?
2.2 問題排查
2.3 哪種情況會報這樣的錯?
2.4 為什麼上述情況會報錯?
三、解決方案
3.1 第一種解決方案
3.2 第二種解決方案
一、背景描述
最近新建立了一個Spring boot項目,接口寫完之後,通過Swagger-ui通路調試接口,在浏覽器中輸入http://localhost:8006/swagger-ui.html 可以正常通路
如上圖所示,頁面顯示正常,但是在Idea控制台卻報錯,如下圖:
二、問題原因
2.1 為什麼會報錯?
java.lang.NumberFormatException: For input string: "",根據報錯内容顯示,是因為輸入了 空字元串"",而空字元串無法轉為 Number 類型。
2.2 問題排查
由于這是在通過浏覽器通路Swagger時控制台報的錯,那麼我們就從控制台中的swagger報錯資訊開始查找,如下圖紅框内顯示,AbstractSerializableParameter.java這個類的getExample方法。
按住鍵盤的Ctrl 鍵,點選AbstractSerializableParameter類,進入swagger的源碼檢視(在抛出異常的位置打上斷點,并以Debug模式啟動:)
浏覽器中重新整理swagger文檔(重新進入swagger文檔),程式停在斷點處:
通過斷點,我們找到了問題,那麼我們就可以做對應的修改了,也就是為對應的屬性上加上
example
屬性就好了,如下:
2.3 哪種情況會報這樣的錯?
目前,隻發現了把實體屬性用作參數,并且參數類型不是
application/json
時,就會出現這個錯。如下圖所示:
2.4 為什麼上述情況會報錯?
上述情況也就是把實體屬性用作參數,并且參數類型不是
application/json
時,io.swagger.models.parameters.AbstractSerializableParameter 會執行個體化參數,也就是通過example的值為屬性指派,如果example沒有顯示指派,就是空串"",但是如果實體類用作 application/json 那麼就不會走這個方法去執行個體化參數。
三、解決方案
3.1 第一種解決方案
把項目裡面的使用這種屬性的情況,也就是在@ApiModelProperty注解裡面寫上 example = “1”,其實就是給出一個示例,具體寫1還是2或3都無所謂,但要注意一點是 example 對應的值必須是Integer類型的。如2.2中一樣。
3.2 第二種解決方案
既然存在這種問題,開發者不會沒有發現吧,然後就去看了看swagger-models的其他版本,發現在swagger-models:1.5.20版本是springfox-swagger2:2.9.2裡面依賴的版本,既然是依賴,那就自己引用了一個swagger-models:1.5.21的版本,然後看看源碼,發現 在新的版本中進行了改正。于是我把swagger-models:1.5.20版本排除了,然後單獨引入了swagger-models:1.5.21版本。
再次通過浏覽器通路swagger-ui發現問題得到解決。
完結!