Vert.x RESTful Verticle

时间:2016-01-23 23:44:08

标签: java spring vert.x

我对Vert.x非常陌生,就像新的一样。我来自JAX-RS,RESTeasy世界。我可能是非常错的,请纠正我。

所以,我想用vertx-web和Spring编写一个REST API。我将Verticle视为REST资源。 我查看了vertx-web blogspring-example,但示例非常简单,主要只包含一个资源和Verticle。

我的问题是:如何使Verticle公开自己的REST接口(子路由器),以及如何将其子路由器注册到应用程序的主路由器中?

我尝试了类似的东西但是当我请求/ products / all时我得到404 :(

public class ProductsVerticle extends AbstractVerticle {

@Override
public void start(Future<Void> startFuture) throws Exception {
    super.start(startFuture);
}

public static Router getRouter() {
    Router router = Router.router(Vertx.vertx());

    router.get("/all").consumes("application/json").produces("application/json")
            .handler(routingContext -> {
                routingContext.response()
                        .putHeader("content-type", "text/html")
                        .end("<h1>Products</h1>");
            });

    return router;
}

}

public class ServerVerticle extends AbstractVerticle {

@Override
public void start() throws Exception {
    super.start();

    Router mainRouter = Router.router(vertx);
    ProductsVerticle productsVerticle = new ProductsVerticle();

    vertx.deployVerticle(productsVerticle, handler -> {
        if (handler.succeeded()) {
            LOG.info("Products Verticle deployed successfully");
            mainRouter.mountSubRouter("/products", productsVerticle.getRouter());
        }
    });

    mainRouter.get("/static").handler(routingContext -> {
        routingContext.response()
                .putHeader("content-type", "text/html")
                .end("<h1>Hello from my first Vert.x 3 application</h1>");
    });

    HttpServer server = vertx.createHttpServer();
    server.requestHandler(mainRouter::accept);
    server.listen(8090);
}

}

2 个答案:

答案 0 :(得分:2)

你的需要是绝对可以理解的。但我们应该尽快考虑春天的作用:   - 当应用程序服务器启动时,执行startuphook,它在整个类路径中搜索每个用Jax-rs Annotations分配的类,并将它们初始化或只是在&#34;路由器&#34;上注册它们。

所以,如果你想要那样,你可以拥有它,但你必须通过你自己做到这一点。对不起:D。

例如:

class Server extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        List<AbstractVerticle> verticles = searchForVerticlesWithMyAnnotation();
        verticles.forEach((V) = > router.add(V));
    }

}

@MyOwnJax(path = "/blaa")
public class TestService {
}

@interface MyOwnJax {
    String path();
}

方法&#34; searchForVerticlesWIthMyAnnotation&#34;这是件棘手的事。它不应该慢。但是如果你使用Spring,你可以使用类似的东西: org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

或点击此处:Stackoverflow: Search for Annotations @runtime

但是这是一个很大的但是在这里。 ;) 也许你有一个更好的主意,然后Spring来制作你的REST api? 春天真的是&#34; klobby&#34;在我看来,Vertx.x非常流畅。 (对不起我的不切实际的意见,我很抱歉。)

我在我的应用程序中使用了DI的方法。这意味着:

router.route(HttpMethod.GET,
 "/user/login").handler(injector.getInstance(ILoginUser.class));

使用普通的guice框架作为注入器。虽然这只是一个界面,但您必须在启动服务器的Verticle中更改某些内容之前进行重大更改。 (实际上大多数情况下,只需要添加或删除路径)

<强>要点:

  • 如果你想要一个Spring方法,你必须使用反射或使用反射的库。 缺点:启动性能,有时甚至有点神奇,很难找到错误/调试。 好处:易于测试,非常容易扩展功能

  • 在自己的路径上注册Verticle。 缺点:您必须在&#34;服务器&#34; -verticle上添加/删除路径。 好处:启动 - 性能,没有魔力,完全控制发生的事情和时间。

这只是一个简短的总结,并没有提到很多要点。但我希望这能回答你的问题。如果你有一些问题,那就写吧!

Jeerze,

西米

答案 1 :(得分:1)

我最近为vert.x编写了一个简单的JAX-RS注释库。
在它的方法中,它类似于RestEasy。

https://github.com/zandero/rest.vertx