ドキュメント

§ルーティングDSL

Playは、コード内で直接ルーター用のDSLを提供します。このDSLには、軽量Playサーバーの埋め込み、通常のPlayアプリケーションへのカスタムまたはより高度なルーティング機能の提供、テスト用のRESTサービスのモックなど、多くの用途があります。

このDSLは、Playのコンパイル済みルートファイルと同様のパスパターン構文を使用し、パラメーターを抽出し、ラムダを使用して実装されたアクションを呼び出します。

DSLはRoutingDslによって提供されます。アクションを実装することになるため、Resultsからの静的メソッド(結果を作成するためのファクトリメソッドを含む)をインポートすることをお勧めします。DSLは現在のHttp.Requestにアクセスできます。これを使用してセッション、Cookieなどにアクセスできます。そのため、通常は少なくとも次のインポートが必要です。

import javax.inject.Inject;

import play.api.mvc.AnyContent;
import play.api.mvc.BodyParser;
import play.api.mvc.PlayBodyParsers;
import play.mvc.Http;
import play.routing.Router;
import play.routing.RoutingDsl;
import java.util.concurrent.CompletableFuture;

import static play.mvc.Controller.*;

その後、依存関係注入を使用してRoutingDslインスタンスを取得できます。

public class MyComponent {

  private final RoutingDsl routingDsl;

  @Inject
  public MyComponent(RoutingDsl routing) {
    this.routingDsl = routing;
  }
}

または、新しいインスタンスを直接作成することもできます。

RoutingDsl routingDsl = new RoutingDsl(bodyParser);

DSLの使用の簡単な例を以下に示します。

Router router =
    routingDsl.GET("/hello/:to").routingTo((request, to) -> ok("Hello " + to)).build();

アクションブロックの最初の引数はHttp.Requestです。次に、:toパラメーターが抽出され、ルーターの最初の引数として渡されます。パスパターンでパラメーターに付ける名前は関係なく、重要なのは、パス内のパラメーターがラムダ内のパラメーターと同じ順序であることです。パスパターンには0〜3個のパラメーターを含めることができ、POSTPUTDELETEなどの他のHTTPメソッドもサポートされています。

注記:DSLを使用する場合、最初の引数は常にHttp.Requestになります。次の引数は、ルートパターンで実際に宣言した引数です。

Playのコンパイル済みルーターと同様に、DSLも複数パスセグメントパラメーターの一致をサポートしています。これは、パラメーターの前に*を付けることによって行われます。

Router router =
    routingDsl.GET("/assets/*file").routingTo((request, file) -> ok("Serving " + file)).build();

正規表現もサポートされており、パラメーターの前に$を付け、パラメーターの後に山括弧で囲まれた正規表現を付けることによって行われます。

Router router =
    routingDsl
        .GET("/api/items/$id<[0-9]+>")
        .routingTo((request, id) -> ok("Getting item " + id))
        .build();

上記の例では、ラムダ内のパラメーターの型は宣言されていません。JavaコンパイラはこれをObjectとしてデフォルトで設定します。この場合、ルーティングDSLはパラメーターをStringとして渡しますが、パラメーターに明示的な型を定義すると、ルーティングDSLはその型にパラメーターのバインドを試みます。

Router router =
    routingDsl
        .GET("/api/items/:id")
        .routingTo((Http.Request request, Integer id) -> ok("Getting item " + id))
        .build();

サポートされている型には、IntegerLongFloatDoubleBoolean、およびPathBindableを拡張する任意の型が含まれます。

もちろん、routingAsyncメソッドを使用して非同期アクションもサポートされています。

Router router =
    routingDsl
        .GET("/api/items/:id")
        .routingAsync(
            (Http.Request request, Integer id) ->
                CompletableFuture.completedFuture(ok("Getting item " + id)))
        .build();

§ルーティングDSLのバインディング

アプリケーションでルーティングDSLを使用するように構成するには、ユースケースに応じて多くの方法があります。

§Playの組み込み

ルーティングDSLを使用したPlayサーバーの組み込みの例は、Playの組み込みセクションにあります。

§DIルーターの提供

ルーターは、アプリケーションのエントリポイントルーターの提供で詳述されているように、たとえばJavaビルダークラスとアプリケーションローダーを使用して、アプリケーションに提供できます。

public class AppLoader implements ApplicationLoader {
  public Application load(ApplicationLoader.Context context) {
    return new MyComponents(context).application();
  }
}

class MyComponents extends RoutingDslComponentsFromContext
    implements play.filters.components.NoHttpFiltersComponents {

  MyComponents(ApplicationLoader.Context context) {
    super(context);
  }

  @Override
  public Router router() {
    return routingDsl().GET("/hello/:to").routingTo((request, to) -> ok("Hello " + to)).build();
  }
}

§Guiceを使用したDIルーターの提供

Guice経由のルーターは、次のスニペットで提供できます。

@Singleton
public class GuiceRouterProvider implements Provider<play.api.routing.Router> {

  private final RoutingDsl routingDsl;

  @Inject
  public GuiceRouterProvider(RoutingDsl routingDsl) {
    this.routingDsl = routingDsl;
  }

  @Override
  public play.api.routing.Router get() {
    return routingDsl
        .GET("/hello/:to")
        .routingTo((request, to) -> ok("Hello " + to))
        .build()
        .asScala();
  }
}

そしてアプリケーションローダーで

public class GuiceAppLoader extends GuiceApplicationLoader {

  @Override
  protected GuiceableModule[] overrides(ApplicationLoader.Context context) {
    GuiceableModule[] modules = super.overrides(context);
    GuiceableModule module =
        GuiceableModule$.MODULE$.fromPlayBinding(
            new BindingKey<>(play.api.routing.Router.class)
                .toProvider(GuiceRouterProvider.class)
                .eagerly());

    List<GuiceableModule> copyModules = new ArrayList<>(Arrays.asList(modules));
    copyModules.add(module);

    return copyModules.toArray(new GuiceableModule[copyModules.size()]);
  }
}

§バインディングのオーバーライド

ルーターは、バインディングとモジュールで詳述されているように、アプリケーションローダーでGuiceApplicationBuilderなどを使用して、カスタムルーターバインディングまたはモジュールでオーバーライドすることもできます。

次へ:カスタムバインディング


このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に投稿してください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。