2017-01-05 12 views
4

私はSpringを使ってリアクティブプログラミングの世界に加わりたいと思っています。私が気づいたように、it gives me a choice between two different paradigms:注釈ベース(よく知られている通り、@Controller@RequestMapping)と反応性のあるもの(which is intended to resolve an "Annotation Hell")です。Spring 5を使用した実際のコントローラの例:Web Reactive

私の問題は、典型的なリアクティブコントローラがどのように見えるか理解していないことです。 - 私はルータとこれらのメソッドを登録し、その後、コンクリートHandlerFunction<T>インスタンスを返し、各特定ServerRequest するための方法を定義

HandlerFunction<T>(1):私は私のコントローラクラスで使用できる3つの概念的なインターフェイスがあります。右?

RouterFunction(2)及びFilterFunction(3) - HandlerFunction Sを対応するすべてのRequestPredicate sが置かれるべき具体的な場所はありますか?あるいは、私は各コ​​ントローラで別々に行うことができますか(私はアノテーションのアプローチと同じでした)?もしそうなら、どのようにこのコントローラからこのルータ部分を適用するためにグローバルハンドラ(ルーターがあれば?)に通知するのですか?

それは私が今では反応コントローラ「テン​​プレート」を参照してください方法は次のとおりです。それは、アノテーションとそれをマークせず、コントローラであることを言って最後に、どのように、

public class Controller { 
    // handlers 
    private HandlerFunction<ServerResponse> handleA() { 
     return request -> ok().body(fromObject("a")); 
    } 

    // router 
    public RouterFunction<?> getRouter() { 
     return route(GET("/a"), handleA()).and(
       route(GET("/b"), handleB())); 
    } 

    // filter 
    public RouterFunction<?> getFilter() { 
     return route(GET("/c"), handleC()).filter((request, next) -> next.handle(request)); 
    } 
} 

と?

私はSpringのリファレンスとこの問題に関するすべての記事を公式ブログで読んだことがあります。たくさんのサンプルがありますが、それらはすべてコンテキスト(IMHO)から取り出されており、完全な画像に組み立てることはできません。

実世界の例と、これらの機能間のやりとりを構成する方法の良いプラクティスを提供できれば、私は感謝します。私の知る限り、関係として

+1

これは、特にしばらくので、おそらく提起として広すぎますAPIはおそらくほぼ安定していますが、Spring 5はまだ技術的にRCでさえありません(そしてSpring Security Reactiveは依然として大きな進歩を遂げています)。 – chrylis

+3

_ "Springと反応するプログラミングの世界は、2つの異なるパラダイムの間で選択肢を与えます:アノテーションベースのものと反応性のもの" _アノテーションベースの機能的なもの "のようなものでなければなりません。どちらも反応的ですが、アノテーションベースのスタイルだけが古典的なコントローラを持っています。 – zeroflagL

+1

ここで質問されていることは、特に機能モデルの場合、「コードを整理する方法」だと思います。私もこれで苦労しました。サンプルコードでは、すべてのリクエストマッピング(ルート)を1つの長いNLPスタイルチェーンで宣言する必要があります。これにより、同じクラスファイルに記述する必要のないルート間の結合が導入され、ハンドラ固有のクラスを作成しようとすると、そのルートが別々に格納されます。 アノテーションベースのアプローチは、これらの問題に対処するように見えますが、私はまだそのメソッドを動作させるようにしていません。それがうまくいっても、なぜ機能的なアプローチがありますか? – allenru

答えて

2

RouterFunctionが新しいSpring approachの面で@Controller(正確に@RequestMapping)に最も近い類似体である:

着信要求が RouterFunction(すなわちでハンドラ関数にルーティングされます関数>)。ルータ関数は、一致する場合は ハンドラ関数を評価します。それ以外の場合は空の結果を返します。 RouterFunctionは@RequestMapping アノテーションと同様の目的を持っています。しかし、重要な違いがあります。 アノテーションでは、経路は 注釈値で表現できるものに限定されており、それらの処理は オーバーライドには簡単ではありません。ルータの機能を使用すると、処理コードが手前に表示されます :あなたはそれを簡単に上書きまたは置き換えることができます。 mainメソッドで代わりに春ブーツSpringApplication.runのその後

ランニングサーバーを手動によって:

// route is your route function 
HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); 
HttpServlet servlet = new ServletHttpHandlerAdapter(httpHandler); 
Tomcat server = new Tomcat(); 
Context rootContext = server.addContext("", 
System.getProperty("java.io.tmpdir")); 
Tomcat.addServlet(rootContext, "servlet", servlet); 
rootContext.addServletMapping("/", "servlet"); 
tomcatServer.start(); 

反応性および非反応性の両方のアプローチがあります。これは、春に示されていますgithub

+0

応答に感謝しますが、私は主にコントローラがどのように見えるのか、そしてそのようなコントローラ間の相互作用をどのように構成するのかに大いに興味を持っていました。あなたのスニペットは、グローバル/共有のものを集めるときに起こる混乱を明るく示しています(例えば、「RouterFunction」はすべてのものを一度に1つの場所に置くようになっています)。 – Andrew

+0

githubのリンクをありがとうございますが、私は本当に 'main'メソッドや' configureGlobalRouting'のような名前のメソッドにすべてのルーティングロジックを書きたいとは思っていません。 – Andrew

+0

@AndrewTobilko私は、新しい春に似たratpackフレームワークに似た、https://ratpack.io/manual/current/spring.html#the_spring_convenience_classにかなり似たやり方を提案することができます –

関連する問題