SpringBoot2.0與Undertow容器采坑筆錄


1、前言

  • 此文章記錄Spring Boot2.x以上版本的上傳文件統一處理文件過大問題進行做筆錄。
  • 此文章記錄提出解決Spring Boot2x與undertow服務器上統一處理文件過大問題解決思路
  • 通過查找各種資料足以證明,SpringBoot2.x與Tomcat更為說服力,詳細請認真看文章,希望文章對你有所獲.

2、解決的思路

  • 【第1種】解決的思路

  • 配置springboot2.x文件上傳,max-file-size,max-request-size參數

  • 把undertow服務器改成Tomcat,在一個類統一處理捕獲上傳文件控制文件最大限制,然后進行攔截拋異常編碼和提示返回給前端。

  • 【第2種】解決的思路

  • 重寫 undertow容器的io.undertow包的UndertowMessages_bundle改成UndertowMessages_bundle_zh_CN、然后在自個工程新建一個io.undertow然后進行修改 private static final String maxFileSizeExceeded = "UT000054: 上傳的單個文件大小不能超過%sMB";

 

 

 

UndertowMessages.png
  • 在Springboot的入口類加上支持國際化設置,經過本人測試超過設置最大請求值的時候spring.servlet.multipart.max-request-size,此時也無法返回自定義的codemsg

報錯點:{"timestamp":"2019-06-04 16:09:53","status":500,"error":"Internal Server Error","message":"io.undertow.server.handlers.form.MultiPartParserDefinition$FileTooLargeException: UT000054: 上傳的單個文件大小不能超過10MB","path":"/rest/importData"}

  • 支持編碼國際化設置
Locale.setDefault(Locale.SIMPLIFIED_CHINESE); 
  • 異常還是無法解決統一攔截處理。


     

     

     

    異常.png

3、建議方案

  • 1、建議使用SpringBoot2.x的內置Tomcat,去除使用undertow容器的大坑問題。原因這個問題影響整個項目導入文件過大的問題進行統一攔截控制,如果不改成Tomcat服務器運行,后端無法統一捕獲文件上傳過大的異常。在對undertow它不了解的情況下,可以考慮前端進行控制,如果改成前端處理不是不可以,只是不夠嚴謹,而且從根本上解決不了問題所在

  • 2、不建議使用undertow,undertow是Redhat的產品,而Redhat又IBM給收購了

  • 經過各種折騰的排除問題,嘗試各種谷歌搜索的文章,個人認為undertow不是一個好東西,原因:undertow網上的解決方案文章非常少,而且Tomcat不用就是找坑,Tomcat起碼經得起市場的考驗,可以說半壁江山的WEB服務應用都Run在Tomcat上。

4、找到問題所在根源

  • 排除tomcat依賴使用undertow容器的大坑問題所在pom.xml配置
  • 異常信息為:java.lang.IllegalStateException: io.undertow.server.handlers.form.MultiPartParserDefinition$FileTooLargeException: UT000054: The maximum size 10485760 for an individual file in a multipart request was exceeded larger than 10485760
<!--web 模塊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除(去除)tomcat依賴--> <exclusion> <artifactId>spring-boot-starter-tomcat</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!--undertow容器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> 

5、Springboot2.x文件上傳配置參數

spring.servlet.multipart.enabled=true # 是否支持多部分上傳。
spring.servlet.multipart.max-file-size=1MB # 最大支持文件上傳的大小
spring.servlet.multipart.max-request-size=10MB # 支持請求最大文件上傳的大小

6、 undertow容器的大坑異常SpringBoot無法捕獲異常處理

  • 干掉maven的pom.xml的undertow配置,使用spring-boot-starter-web的內置Tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 

7、新建一個類統一處理攔截異常

  • 在一個類統一處理捕獲上傳文件控制文件最大限制,然后進行攔截拋異常編碼和提示返回給前端。
/** * 全局異常處理器 */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandlerResolver { /** * @Descript 統一處理文件過大問題. */ @ExceptionHandler(MaxUploadSizeExceededException.class) public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { log.error("上傳文件過大 ex={}", e); return retMsgCode("上傳文件過大", 9999); } } 

8、SpringBoot2.x文檔

  • SpringBoot2.x文檔
  • 通過官方文檔上面看也沒看出Undertow與SpringBoot整合有很好的優勢.反而找到它說不支持jsp Undertow does not support JSPs.
  • 從Undertow 1.4.0+開始,支持HTTP/2,而不需要在JDK8上附加任何要求 As of Undertow 1.4.0+, HTTP/2 is supported without any additional requirement on JDK8.
  • 可以啟用多個文件監聽Enable Multiple Listeners with Undertow

9、推薦了解的文章

10、Undertow官方

Undertow是一個用java編寫的靈活的高性能web服務器,提供基於NIO的阻塞和非阻塞API。
Undertow具有基於組合的體系結構,允許您通過組合小型的單一用途處理程序來構建web服務器。它使您可以靈活地選擇是使用完整的Java EE servlet 4.0容器,還是使用低級的非阻塞處理程序,還是使用兩者之間的任何東西。Undertow被設計為完全可嵌入的,易於使用fluent builder api。Undertow的生命周期完全由嵌入應用程序控制。Undertow由JBoss贊助,是Wildfly應用程序服務器中的默認web服務器。

10、個人感想與疑問

  • undertow服務器真的在市場大量使用了?
  • 使用undertow服務器能不能解決未預知的問題呢?
  • 當遇到問題能不能搜索資料來處理問題呢?
  • 當團隊中遇到問題能不能快速定位排除問題進行處理掉呢?
  • 如果沒有很好的案例實戰過與經過市場的考驗,請不要給網上這些所謂的測試數據給蒙蔽,一句話好奇會害死貓


     

     

     



作者:愛學習的蹭蹭
鏈接:https://www.jianshu.com/p/c171eed87f95
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM