无法使用vertx-web

问题描述

The vertx-web documentation说可以从类路径提供静态资源,我在论坛/帮助线程中阅读的所有内容似乎都证实了这一点。不幸的是,我似乎无法使其正常工作。

public class MainVerticle extends AbstractVerticle {

  @Override
  public void start() {
    final Router router = Router.router(vertx);

    router.get("/greeting").handler(req -> req.response().end("Hello Vert.x!"));

    router.route("/*").handler(StaticHandler.create());

    vertx.createHttpServer()
        .requestHandler(router)
        .listen(8080);
  }

}
@ExtendWith(VertxExtension.class)
class MainVerticleTest {

  @BeforeEach
  void prepare(Vertx vertx,VertxTestContext testContext) {
    vertx.deployVerticle(MainVerticle.class.getCanonicalName(),testContext.succeeding(id -> testContext.completeNow()));
  }

  @Test
  @displayName("Check that the server returns greeting")
  void checkServerHasstarted(Vertx vertx,VertxTestContext testContext) {
    WebClient webClient = WebClient.create(vertx);
    webClient.get(8080,"localhost","/greeting")
      .as(BodyCodec.string())
      .send(testContext.succeeding(response -> testContext.verify(() -> {
        assertEquals(200,response.statusCode());
        assertTrue(response.body().length() > 0);
        assertTrue(response.body().contains("Hello Vert.x!"));
        testContext.completeNow();
      })));
  }

  @Test
  @displayName("Check that the server returns router-root.txt")
  void checkServerHasRootResource(Vertx vertx,"/router-root.txt")
      .as(BodyCodec.string())
      .send(testContext.succeeding(response -> testContext.verify(() -> {
        assertEquals(200,response.statusCode());
        testContext.completeNow();
      })));
  }

    
  @Test
  @displayName("Check that the server returns router-package.txt")
  void checkServerHasPackageResource(Vertx vertx,"/router-package.txt")
      .as(BodyCodec.string())
      .send(testContext.succeeding(response -> testContext.verify(() -> {
        assertEquals(200,response.statusCode());
        testContext.completeNow();
      })));
  }
}

checkServerHasstarted通过了,但是其他两个都以404失败了。这里有两个资源文件

  • src/main/resources/router-root.txt
  • src/main/resources/io/vertx/starter/router-package.txt

我已经确认这些文件在胖子罐子的相对路径中存在。

理想情况下,我想从另一个捆绑软件(java项目)中包含这些资源,但首先要考虑的事情。

我是否需要对路线进行处理才能使任何一项失败的测试通过?我刚刚开始使用Vert.x,所以我认为我的设置在某个地方很蠢。

完整项目:https://github.com/drkstr101/vertx-static-example

干杯,谢谢您的指导!

编辑

我意识到有一种StaticHandler.create形式可以接受ClassLoader,并且很可能是如何做到这一点的。但是,从我读到的内容来看,这没有必要,而且还有关于该功能在下一版本中被删除的过时警告。我是否可以认为,一旦弃用该功能,从类路径提供的资源将完全正常工作?

解决方法

资源的默认文件夹为webroot

在项目中创建一个src/main/resources/webroot文件夹,并将所有静态内容移动到该文件夹​​。 或配置StaticHandler更改根文件夹。

侧面说明:对于全部路线,您可以省略路径

router.route().handler(StaticHandler.create());