【问题标题】:Vertx web routing - multiple body handlersVertx Web 路由 - 多个主体处理程序
【发布时间】:2017-12-01 18:20:04
【问题描述】:

我正在 Vertx 中通过 REST 上传文件。我正在现有项目中实现这一点,因此已经有很多路由定义。我在为上传路线定义正文处理程序时遇到问题。在现有的路由定义中,body handler 的第一个定义如下:

router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

这应该为所有传入请求设置此主体处理程序。现在稍后在代码中我想为上传定义特殊的主体处理程序:

router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));

但这不起作用。 BodyHandler 没有被“覆盖”。它仅在我首先定义上传定义时才有效,在“通用”正文处理程序之前。所以这对我有用:

router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

但我想知道是否有一种方法可以先定义通用处理程序,然后一些路由可以定义另一个处理程序。谢谢

【问题讨论】:

    标签: java vert.x


    【解决方案1】:

    您不能“覆盖”处理程序。 BodyHandler 任务是在传入请求中设置适当的处理程序并解析请求正文。这些事件只触发一次,因此如果您添加多个处理程序,只有第一个匹配的处理程序才能处理这些事件。

    您可能不需要多个处理程序,其顶级处理程序可以解析请求正文并在路由上下文中填充表单数据和文件上传属性。所以如果你想让它表现得不同,上传到不同的位置你可以只执行文件移动操作。

    如果您需要完全不同的配置,那么您需要指定不相交的路线,例如:

    router.post("/upload/path")
      .handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
    router.route("/something/else")
      .handler(BodyHandler.create().setBodyLimit(1024*1024));
    

    如您所见,这 2 个路由器是不同的,只有 1 个会匹配,让您拥有正确的上传配置。

    【讨论】:

    • 好的,感谢您的澄清。似乎有点不直观,因为我尝试为路由“设置”新的处理程序并且它没有实际使用或抛出异常。但我知道只使用了一个。
    【解决方案2】:

    我认为这是不可能的。我也为此苦苦挣扎。根据我的经验,vert.x 有一个匹配第一个可能注册路由的路由匹配算法。这意味着如果你有

    router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
    router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
    

    然后它将首先匹配router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));,如果您尝试通过另一个主体处理程序运行请求,则会引发错误。

    如果是:

    router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
    router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
    

    它将首先匹配您的主体处理程序并忽略另一个,因为它已经匹配了路径的一部分。

    你可以在

    中添加一个 if 子句
    router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
    

    "/upload/path" 上,您只需调用 next() 而不是正文处理程序,但我认为这不是一个好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 2013-02-27
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2011-06-05
      相关资源
      最近更新 更多