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服务器能不能解决未预知的问题呢?
  • 当遇到问题能不能搜索资料来处理问题呢?
  • 当团队中遇到问题能不能快速定位排除问题进行处理掉呢?
  • 如果没有很好的案例实战过与经过市场的考验,请不要给网上这些所谓的测试数据给蒙蔽,一句话好奇会害死猫


    test
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容