天天看點

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

本文目錄

一、背景描述

二、問題原因

2.1 為什麼會報錯?

2.2 問題排查

2.3 哪種情況會報這樣的錯?

2.4 為什麼上述情況會報錯?

三、解決方案

3.1 第一種解決方案

3.2 第二種解決方案

一、背景描述

最近新建立了一個Spring boot項目,接口寫完之後,通過Swagger-ui通路調試接口,在浏覽器中輸入http://localhost:8006/swagger-ui.html 可以正常通路

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

如上圖所示,頁面顯示正常,但是在Idea控制台卻報錯,如下圖:

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

二、問題原因

2.1 為什麼會報錯?

java.lang.NumberFormatException: For input string: "",根據報錯内容顯示,是因為輸入了 空字元串"",而空字元串無法轉為 Number 類型。

2.2 問題排查

由于這是在通過浏覽器通路Swagger時控制台報的錯,那麼我們就從控制台中的swagger報錯資訊開始查找,如下圖紅框内顯示,AbstractSerializableParameter.java這個類的getExample方法。

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

按住鍵盤的Ctrl 鍵,點選AbstractSerializableParameter類,進入swagger的源碼檢視(在抛出異常的位置打上斷點,并以Debug模式啟動:)

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

浏覽器中重新整理swagger文檔(重新進入swagger文檔),程式停在斷點處:

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

通過斷點,我們找到了問題,那麼我們就可以做對應的修改了,也就是為對應的屬性上加上

example

屬性就好了,如下:

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

2.3 哪種情況會報這樣的錯?

目前,隻發現了把實體屬性用作參數,并且參數類型不是

application/json

時,就會出現這個錯。如下圖所示:

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案
【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

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中一樣。

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

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發現問題得到解決。

【異常處理】關于通路swagger-ui報錯java.lang.NumberFormatException: For input string: ““的解決方案總結一、背景描述二、問題原因三、解決方案

完結!