Vertx的路由器问题

zac*_*ulg 5 java eclipse routes vert.x

早上好,我从Vertx for java开始,我想创建路由示例,所以我复制过去的行,但似乎在Router.router(顶点)中出现了问题:

  • 无法解析io.vertx.rxjava.core.Vertx类型.它是从所需的.class文件间接引用的

    • 路由器类型中的方法路由器(Vertx)指的是丢失类型Vertx

这是我的代码:

import io.vertx.core.*;
import io.vertx.rxjava.ext.web.*;
import io.vertx.core.http.HttpHeaders;

public class Test extends AbstractVerticle{

@Override
public void start() throws Exception {

    Vertx vertx=Vertx.vertx();
    Router router = Router.router(vertx);

    Route route1 = router.route("localhost:8080/Orsys/").handler(routingContext -> {

          HttpServerResponse response = routingContext.response();
          response.setChunked(true);

          response.write("Orsys\n");

          routingContext.vertx().setTimer(5000, tid -> routingContext.next());
        });
Run Code Online (Sandbox Code Playgroud)

Eri*_*hao 9

首先,类中的Vertx实例io.vertx.core.AbstractVerticle是指io.vertx.core.Vertx,而不是io.vertx.rxjava.core.Vertx.所以你应该导入io.vertx.ext.web.Router而不是io.vertx.rxjava.ext.web.Router,或者它不匹配.

其次,该Route#route方法不是静态方法,因此首先需要创建一个Router实例:

Router router = Router.router(vertx);
Run Code Online (Sandbox Code Playgroud)

然后调用route方法:

router.route("/Test1").handler(routingContext -> {
            HttpServerResponse response = routingContext.response();
            response.setChunked(true);
            response.write("Test1 \n");

            routingContext.vertx().setTimer(1000, tid ->  routingContext.next());
        });
Run Code Online (Sandbox Code Playgroud)

请注意,该route方法接受绝对URL,因此您无需传递绝对URL.直接传递/Test1URL路径,可以在createHttpServer时配置主机和端口.

另一个注意事项是,如果要将字节直接写入响应,则应添加response.setChunked(true)或抛出异常:

java.lang.IllegalStateException: You must set the Content-Length header to be the total size of the message body BEFORE sending any data if you are not using HTTP chunked encoding.
Run Code Online (Sandbox Code Playgroud)

或者这更好(总是和end):

router.route("/Test1").handler(routingContext -> {
            HttpServerResponse response = routingContext.response();
            response.putHeader("content-type", "text/html");
            response.end("<h1>Test1</h1>");
        });
Run Code Online (Sandbox Code Playgroud)

到目前为止,您已经建立了一个简单的路由,因此下一步是创建一个HttpServer:

vertx.createHttpServer()
                .requestHandler(router::accept)
                .listen(8080, "127.0.0.1", res -> {
                    if (res.failed())
                        res.cause().printStackTrace();
                });
Run Code Online (Sandbox Code Playgroud)

好吧,端口和主机可以传递给listen方法.

所以这是更改的正确代码:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.Router;

public class TestVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> startFuture) throws Exception {
        Router router = Router.router(vertx);

        router.route("/Test1").handler(routingContext -> {
            HttpServerResponse response = routingContext.response();
            response.setChunked(true);
            response.write("Test1 \n");

            routingContext.vertx().setTimer(1000, tid ->  routingContext.next());
        });

        vertx.createHttpServer()
                .requestHandler(router::accept)
                .listen(8080, "127.0.0.1", res -> {
                    if (res.succeeded())
                        startFuture.complete();
                    else
                        startFuture.fail(res.cause());
                });
    }
}
Run Code Online (Sandbox Code Playgroud)

通过部署Verticle来运行它:

public class Application {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        TestVerticle verticle = new TestVerticle();

        vertx.deployVerticle(verticle, res -> {
            if (res.failed())
                res.cause().printStackTrace();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这只是一个简单的例子.如果你想构建一个RESTful服务,这篇文章可能会有所帮助:一些与Vert.x一起休息

这是我使用Vert.x Web的RESTful服务的示例,它也可以提供帮助:https://github.com/sczyh30/todo-backend-vert.x

我希望这些可以帮到你:)