Использование Thymeleaf TemplateEngine с Vert.x 3.9 - PullRequest
1 голос
/ 12 апреля 2020

Я новичок в Vertx. Я пытаюсь создать шаблонизатор thymeleaf в своем приложении, но возникает эта ошибка

java: несовместимые типы: io.vertx.core.Vertx не может быть преобразован в io.vertx. реактивный x.core.Vertx

и если я разыграю vertx на io.vertx.reactive.core.Vertx, я получу эту ошибку

java .lang.ClassCastException: io.vertx.core.impl.VertxImpl не может быть приведен к io.vertx.reactivex.core.Vertx

Кроме того, соединение с базой данных успешно и если я удалю TemplateEngine, код строки будет работать гладко.

package com.firstapp.main;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.mysqlclient.MySQLConnectOptions;
import io.vertx.mysqlclient.MySQLPool;
import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.ext.web.common.template.TemplateEngine;
import io.vertx.reactivex.ext.web.handler.TemplateHandler;
import io.vertx.reactivex.ext.web.templ.thymeleaf.ThymeleafTemplateEngine;
import io.vertx.sqlclient.PoolOptions;
import io.vertx.sqlclient.SqlConnection;

public class MainVerticle extends AbstractVerticle {

  private int server_port = 8080;

  @Override
  public void start(Promise<Void> startPromise) throws Exception {

    Future<Void> handshake = prepareDatabase().compose(estb -> startServer());
    handshake.onComplete(startPromise);

  }

  private Future<Void> startServer(){
    Promise<Void> promise = Promise.promise();

    Router router = Router.router(vertx);
    HttpServer server = vertx.createHttpServer();
TemplateEngine engine = ThymeleafTemplateEngine.create((Vertx) vertx);
TemplateHandler handler = TemplateHandler.create(engine);
    router.route("/").handler(routingContext -> {
      HttpServerResponse response = routingContext.response();
      response.putHeader("content-type", "text/html").end("<h1>First App</h1>");
    });

    server.requestHandler(router).listen(config().getInteger("http.port", server_port), result -> {
      if(result.succeeded()){
        System.out.println("Server Started at Port '"+server_port+"'");
        promise.complete();
      }
      else{
        System.out.println("Failed to Start Server");
        promise.fail(result.cause());
      }
    });

    return promise.future();
  }

  private Future<Void> prepareDatabase(){
    Promise<Void> promise = Promise.promise();

    MySQLConnectOptions connectOptions = new MySQLConnectOptions()
      .setPort(3306)
      .setHost("localhost")
      .setDatabase("vertx_db")
      .setUser("root")
      .setPassword("");

    PoolOptions poolOptions = new PoolOptions().setMaxSize(5);

    MySQLPool client = MySQLPool.pool(vertx, connectOptions, poolOptions);

    client.getConnection(connect -> {
      if (connect.failed()){
        System.out.println("Failed to Connect to Database.");
        promise.fail(connect.cause());
      }
      else{
        SqlConnection conn = connect.result();
        conn.close();
        System.out.println("Database connection successful.");
        promise.complete();
      }
    });

    return promise.future();
  }
}

Пожалуйста, сообщите мне, если вы знаете, как исправить. Спасибо

1 Ответ

1 голос
/ 12 апреля 2020

Откуда вы импортируете следующие ...reactivex... классы? (т.е. какой JAR?):

import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.ext.web.common.template.TemplateEngine;
import io.vertx.reactivex.ext.web.handler.TemplateHandler;
import io.vertx.reactivex.ext.web.templ.thymeleaf.ThymeleafTemplateEngine;

Похоже, что этот JAR содержит класс io.vertx.reactivex.core.Vertx, который конфликтует с Vertex, который необходимо использовать: io.vertx.core.Vertx.

Попробуйте удалить этот JAR из вашего проекта (или просто из этого класса, если он вам нужен в другом месте), а затем использовать вместо этого следующее (представленное как зависимости Maven):

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-core</artifactId>
    <version>3.9.0</version>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
    <version>3.9.0</version>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web-templ-thymeleaf</artifactId>
    <version>3.9.0</version>
</dependency>
<dependency>
    [others, as needed - e.g. your SQL dependencies...]
</dependency>

Тогда вам нужно только выполнить что-то вроде этого, для поддержки шаблонов Thymeleaf:

import io.vertx.ext.web.templ.thymeleaf.ThymeleafTemplateEngine;

...

final ThymeleafTemplateEngine engine = ThymeleafTemplateEngine.create(vertx);

А затем используйте engine.render() для рендеринга выбранного шаблона с данными модели.

Вот пример на GitHub здесь . Пример также зависит от класса Runner, который здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...