Проблемы маршрутизатора с Vertx

Доброе утро, я начинаю с Vertx для java, и я хочу создать пример маршрута, поэтому я копирую строки, но, похоже, что-то не так в Router.router (vertex):

  • Тип io.vertx.rxjava.core.Vertx не может быть разрешен. На него косвенно ссылаются из требуемых файлов .class

    • The method router(Vertx) from the type Router refers to the missing type 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());
        });

person zackzulg    schedule 25.03.2016    source источник


Ответы (2)


Сначала экземпляр 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);

А затем вызовите метод маршрута:

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

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

Обратите внимание, что метод route не принимает абсолютный URL-адрес, поэтому вам не нужно передавать абсолютный URL-адрес. Непосредственно передайте /Test1 URL-путь, и хост и порт можно настроить при 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.

Или это лучше (всегда wnd с end):

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

К настоящему времени вы установили простой маршрут, поэтому следующим шагом будет создание HttpServer:

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

Что ж, порт и хост можно передать методу 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());
                });
    }
}

Запустите это, развернув вертикаль:

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

Это всего лишь простой пример. И если вы хотите создать службу RESTful, эта статья может помочь: Отдохни с Vert.x

А вот мой пример службы RESTful с использованием Vert.x Web, который также может помочь: https://github.com/sczyh30/todo-backend-vert.x

Надеюсь, это поможет вам :)

person Eric Zhao    schedule 26.03.2016
comment
Спасибо @ sczyh30 за ваши объяснения, очень полезно :) Я попытался перестроить свой код с помощью Gradle (даже если я не знаком с ним, но полезно открывать для себя новые вещи) Но, похоже, он не работает как обычный проект Я имею в виду запустить конфигурацию и установить мою, поправьте меня, если я ошибаюсь. С Уважением. - person zackzulg; 28.03.2016

Ответ Эрика Чжао великолепен. Но я хочу кое-что добавить.

Я столкнулся с той же проблемой с моим приложением Vert.x. Сначала он сказал Cannot resolve symbol 'Router'. Поэтому я импортирую io.vertx.ext.web.Router. Но мое приложение не импортировало его и написало Cannot resolve symbol 'web', а также Cannot resolve symbol 'Router'.

Я решил эту проблему, добавив ниже зависимость к моему pom.xml.

Maven

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-web</artifactId>
 <version>3.6.2</version>
</dependency>

Gradle

dependencies {
 compile 'io.vertx:vertx-web:3.6.2'
}
person CRV    schedule 22.01.2019
comment
Я встретил точную проблему, пришлось добавить зависимость vertx-web - person Julian Gong; 21.07.2019