无法使用 vertx-web 从类路径提供静态资源
Unable to serve static resources from classpath using vertx-web
The vertx-web documentation 说可以从类路径提供静态资源,我在 forum/help 线程中阅读的所有内容似乎都证实了这一点。不幸的是,我似乎无法让它工作。
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, VertxTestContext testContext) {
WebClient webClient = WebClient.create(vertx);
webClient.get(8080, "localhost", "/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, VertxTestContext testContext) {
WebClient webClient = WebClient.create(vertx);
webClient.get(8080, "localhost", "/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
并且我已确认这些文件存在于 fat jar 中的相对路径中。
理想情况下,我想包含来自另一个包(java 项目)的这些资源,但首先要做的是。
我需要对我的路线做些什么才能让其中一个失败的测试通过吗?我刚刚开始使用 Vert.x,所以我认为我的设置在某个地方很愚蠢。
完整项目:https://github.com/drkstr101/vertx-static-example
干杯,提前感谢您的指导!
编辑
我知道有一种 StaticHandler.create
的形式可以接受 ClassLoader
,并且很可能是如何处理的。然而,从我读到的内容来看,这应该不是必需的,并且还有一个关于在下一版本中删除该功能的弃用警告。我可以假设一旦该功能被弃用,来自类路径的服务资源将完全正常工作吗?
资源的默认文件夹是 webroot
。
在您的项目中创建一个 src/main/resources/webroot
文件夹,并将所有静态内容移动到其中。
或配置 StaticHandler
更改根文件夹。
旁注:对于 catch-all 路线,您可以省略路径
router.route().handler(StaticHandler.create());
The vertx-web documentation 说可以从类路径提供静态资源,我在 forum/help 线程中阅读的所有内容似乎都证实了这一点。不幸的是,我似乎无法让它工作。
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, VertxTestContext testContext) {
WebClient webClient = WebClient.create(vertx);
webClient.get(8080, "localhost", "/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, VertxTestContext testContext) {
WebClient webClient = WebClient.create(vertx);
webClient.get(8080, "localhost", "/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
并且我已确认这些文件存在于 fat jar 中的相对路径中。
理想情况下,我想包含来自另一个包(java 项目)的这些资源,但首先要做的是。
我需要对我的路线做些什么才能让其中一个失败的测试通过吗?我刚刚开始使用 Vert.x,所以我认为我的设置在某个地方很愚蠢。
完整项目:https://github.com/drkstr101/vertx-static-example
干杯,提前感谢您的指导!
编辑
我知道有一种 StaticHandler.create
的形式可以接受 ClassLoader
,并且很可能是如何处理的。然而,从我读到的内容来看,这应该不是必需的,并且还有一个关于在下一版本中删除该功能的弃用警告。我可以假设一旦该功能被弃用,来自类路径的服务资源将完全正常工作吗?
资源的默认文件夹是 webroot
。
在您的项目中创建一个 src/main/resources/webroot
文件夹,并将所有静态内容移动到其中。
或配置 StaticHandler
更改根文件夹。
旁注:对于 catch-all 路线,您可以省略路径
router.route().handler(StaticHandler.create());