Vertx Web路由 - 多个主体处理程序

时间:2017-11-30 22:25:15

标签: java vert.x

我正在使用Vertx中的REST上传文件。我正在现有项目中实现这一点,因此已有很多路由定义。我有问题为我的上传路线定义身体处理程序。在现有的路由定义中,主体处理程序的第一个定义如下:

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));

但是我想知道是否有办法首先定义公共处理程序,稍后一些路由可以定义另一个处理程序。感谢

2 个答案:

答案 0 :(得分:2)

你不能"覆盖"处理程序。 BodyHandler任务是在incomming请求中设置正确的处理程序并解析请求正文。这些事件只触发一次,所以如果你添加几个处理程序,只有匹配的第一个将能够处理事件。

您可能不需要让多个处理程序具有顶层级别,可以解析请求正文并在路由上下文中填充表单数据和文件上载属性。因此,如果您希望它的行为不同,请上传到不同的位置,您只需执行文件移动操作即可。

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

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

正如您所看到的那样,2台路由器不同,只有1路由器匹配,让您拥有正确的上传配置。

答案 1 :(得分:0)

我不认为这是可能的。我也在努力解决这个问题。根据我的经验,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()而不是身体处理程序,但我不认为这是一个很好的解决方案。