このマニュアルは現在進行形で、未完成の状態です。
本マニュアルの改善に協力いただける場合は、README をご覧ください。

19 スプリングブーツ

ratpack-spring-boot 拡張機能は、スプリングブーツとの統合を実現します。このライブラリには 2 つの主な機能があります。1 つは、スプリング ApplicationContext からラットパックサーバーレジストリを作成する機能、もう 1 つはラットパック自体をスプリングブーツアプリケーションに埋め込む機能です(ApplicationContext を自動的にサーバーレジストリの一部にします)。

1.19 スプリングコンビニエンスクラス

通常のラットパックアプリケーションでは、Springコンビニエンスクラスを使用して簡単にレジストリを作成できます。これは、ほぼ同じように機能し、ラットパックがレジストリを非常に便利な方法でチェーン接続できるようにするため、Guice依存性注入の選択肢または補完機能になります。

以下に、この API を使用してアプリケーションを構成するメインクラスの例を示します。

package my.app;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ratpack.core.server.RatpackServer;

import static ratpack.spring.Spring.spring;

public class Main {
  public static void main(String... args) throws Exception {
    RatpackServer.start(server -> server
      .registry(spring(MyConfiguration.class))
      .handlers(chain -> chain
        .get(ctx -> ctx
          .render("Hello " + ctx.get(Service.class).message()))
        .get(":message", ctx -> ctx
          .render("Hello " + ctx.getPathTokens().get("message") + "!")
        )
      )
    );
  }
}

@Configuration
class MyConfiguration {
  @Bean
  public Service service() {
    return () -> "World!";
  }
}

interface Service {
  String message();
}

Spring.spring() メソッドは ApplicationContext を作成し、ラットパックの Registry インタフェースに適合させます。

注意: スプリングの ListableBeanFactory API は現在、パラメータ化された型を持つ bean の検索をサポートしていません。そのため、適合させた Registry のインスタンスはこの制限によりこれに対応していません。スプリングの ListableBeanFactory API に汎用機能を追加する機能リクエストがあります。

2.19 スプリングブーツアプリケーションにラットパックを埋め込む

ラットパックアプリケーションにスプリング(Registry として)を埋め込む方法とは逆に、逆のことができます。スプリングブーツにサーバーとしてラットパックを埋め込み、スプリングブーツでサポートしているサーブレットコンテナのすばらしい選択肢にすることができます。機能セットのコアは、ラットパックを開始するためにスプリング構成クラスに追加するアノテーション @EnableRatpack です。次に、Action<Chain> 型の @Beans としてハンドラーを宣言できます。たとえば、

package my.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import ratpack.func.Action;
import ratpack.core.handling.Chain;
import ratpack.spring.config.EnableRatpack;

@SpringBootApplication
@EnableRatpack
public class Main {

  @Bean
  public Action<Chain> home() {
    return chain -> chain
      .get(ctx -> ctx
        .render("Hello " + service().message())
      );
  }

  @Bean
  public Service service() {
    return () -> "World!";
  }

  public static void main(String... args) throws Exception {
    SpringApplication.run(Main.class, args);
  }

}

interface Service {
  String message();
}

ヒント: ラットパックはクラスパスにある「/public」または「/static」という静的コンテンツのハンドラーを正常なスプリングブーツアプリケーションのように自動的に登録します。

1.2.19 既存のGuiceモジュールの再利用

Ratpack が Spring アプリケーションに埋め込まれている場合、テンプレートのレンダリングなど、既存の Guice モジュールを再利用すると便利です。これを行うには、Module 型の @Bean を含めます。たとえば、Thymeleaf サポートのための ThymeleafModule を含めます

package my.app;

import java.util.Collections;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import ratpack.func.Action;
import ratpack.core.handling.Chain;
import ratpack.thymeleaf.ThymeleafModule;
import ratpack.spring.config.EnableRatpack;

import static ratpack.thymeleaf3.Template.thymeleafTemplate;

@SpringBootApplication
@EnableRatpack
public class Main {

  @Bean
  public Action<Chain> home(Service service) {
    return chain -> chain.get(ctx -> ctx
      .render(thymeleafTemplate("myTemplate", 
        m -> m.put("key", "Hello " + service.message())))
    );
  }

  @Bean
  public ThymeleafModule thymeleafModule() {
    return new ThymeleafModule();
  }

  @Bean
  public Service service() {
    return () -> "World!";
  }

  public static void main(String... args) throws Exception {
    SpringApplication.run(Main.class, args);
  }

}