数日新しいように、私はVert.xに非常に慣れていません。私はJAX-RS、RESTeasyの世界から来ました。私は非常に間違っているかもしれません、私を訂正してください。
そこで、vertx-webとSpringを使用してRESTAPIを作成したいと思います。VerticlesはRESTリソースと見なしています。vertx-webブログとspring-exampleを調べましたが、例は非常に単純で、ほとんどが1つのリソースとバーティクルのみで構成されています。
私の質問は、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);
}
}
あなたの必要性は絶対に理解できます。しかし、Springが何をするのかをすぐに考える必要があります。--アプリケーションサーバーが起動すると、startuphookが実行され、Jax-rs Annotationsで注釈が付けられたすべてのクラスのクラスパス全体が検索され、初期化されるか、単に「ルーター」に登録されます。
だからあなたがそれを望むなら、あなたはそれを持つことができますが、あなたは自分でそれをしなければなりません。すみません: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();
}
ここでは、メソッド「searchForVerticlesWIthMyAnnotation」が注意が必要です。遅くするべきではありません。ただし、とにかくSpringを使用する場合は、org.springframework.context.annotation.ClassPathScanningCandidateComponentProviderのようなものを使用できます。
またはここを参照してください:Stackoverflow:アノテーションを検索@runtime
しかし、これは、ここでは大きなしかしです。;)おそらく、REST APIを作成するためにSpringよりも良いアイデアがありますか?私の意見では、春は本当に「ずんぐり」ですが、Vertx.xは本当にスムーズです。(私の実際的ではない意見をお詫びします。)
私は自分のアプリケーションでDIを使用したアプローチを使用しています。つまり:
router.route(HttpMethod.GET,
"/user/login").handler(injector.getInstance(ILoginUser.class));
インジェクターとして通常のguiceフレームワークを使用。これは単なるインターフェースですが、サーバーを起動するバーティクルで何かを変更する前に、非常に大きな変更を加えることができます。(実際には、ほとんどの場合、パスを追加または削除する必要がある場合に限ります)
概要:
Springアプローチが必要な場合は、リフレクションまたはリフレクションを使用するライブラリを使用する必要があります。欠点:起動時のパフォーマンス、時には少し魔法がかかり、エラー/デバッグを見つけるのが非常に難しい場合があります。利点:テストがとても簡単で、機能を拡張するのが本当に簡単です
パス自体に頂点を登録します。欠点:「サーバー」バーティクルでパスを追加/削除する必要があります。利点:スタートアップパフォーマンス、魔法なし、何がいつ起こるかについての完全な制御。
それはほんの短い要約であり、多くのポイントは言及されていません。しかし、これがあなたの質問に答えることを願っています。いくつかのフォローアップの質問がある場合は、書いてください!
Jeerze、
シミ
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加