«1. Обзор

Ранее мы представили Ratpack и его интеграцию с Google Guice.

В этой быстрой статье мы покажем, как Ratpack можно интегрировать с Spring Boot.

2. Зависимость Maven

Прежде чем мы продолжим, давайте добавим следующую зависимость в наш pom.xml:

<dependency>
    <groupId>io.ratpack</groupId>
    <artifactId>ratpack-spring-boot-starter</artifactId>
    <version>1.4.6</version>
    <type>pom</type>
</dependency>

Зависимость pom ratpack-spring-boot-starter автоматически добавляет ratpack-spring-boot и spring -boot-starter в наши зависимости.

3. Интеграция Ratpack с Spring Boot

Мы можем встроить Ratpack в Spring Boot в качестве альтернативы контейнерам сервлетов, предоставляемым Tomcat или Undertow. Нам нужно только аннотировать класс конфигурации Spring с помощью @EnableRatpack и объявить bean-компоненты типа Action\u003cChain\u003e:

@SpringBootApplication
@EnableRatpack
public class EmbedRatpackApp {

    @Autowired 
    private Content content;
 
    @Autowired 
    private ArticleList list;

    @Bean
    public Action<Chain> home() {
        return chain -> chain.get(ctx -> ctx.render(content.body()));
    }

    public static void main(String[] args) {
        SpringApplication.run(EmbedRatpackApp.class, args);
    }
}

Для тех, кто больше знаком с Spring Boot, Action\u003cChain\u003e может действовать как веб-фильтр и/или контроллер.

Когда дело доходит до обслуживания статических файлов, Ratpack автоматически регистрирует обработчики статических ресурсов в каталогах /public и /static в @Autowired ChainConfigurers.

Однако текущая реализация этой «магии» зависит от настроек нашего проекта и среды разработки. Поэтому, если мы хотим добиться стабильного обслуживания статических ресурсов в разных средах, мы должны явно указать baseDir:

@Bean
public ServerConfig ratpackServerConfig() {
    return ServerConfig
      .builder()
      .findBaseDir("static")
      .build();
}

Приведенный выше код предполагает, что у нас есть статическая папка в пути к классам. Кроме того, мы называем bean-компонент ServerConfig ratpackServerConfig, чтобы переопределить bean-компонент по умолчанию, зарегистрированный в RatpackConfiguration.

Затем мы можем протестировать наше приложение с помощью ratpack-test:

MainClassApplicationUnderTest appUnderTest
  = new MainClassApplicationUnderTest(EmbedRatpackApp.class);

@Test
public void whenSayHello_thenGotWelcomeMessage() {
    assertEquals("hello baeldung!", appUnderTest
      .getHttpClient()
      .getText("/hello"));
}

@Test
public void whenRequestList_thenGotArticles()  {
    assertEquals(3, appUnderTest
      .getHttpClient()
      .getText("/list")
      .split(",").length);
}

@Test
public void whenRequestStaticResource_thenGotStaticContent() {
    assertThat(appUnderTest
      .getHttpClient()
      .getText("/"), containsString("page is static"));
}

4. Интеграция Spring Boot с Ratpack

Сначала мы зарегистрируем необходимые компоненты в классе конфигурации Spring:

@Configuration
public class Config {

    @Bean
    public Content content() {
        return () -> "hello baeldung!";
    }
}

Затем мы можем легко создать реестр, используя удобный метод spring(…), предоставляемый ratpack-spring-boot:

public class EmbedSpringBootApp {

    public static void main(String[] args) throws Exception {
        RatpackServer.start(server -> server
          .registry(spring(Config.class))
          .handlers(chain -> chain.get(ctx -> ctx.render(ctx
            .get(Content.class)
            .body()))));
    }
}

В Ratpack реестры используются для связи между обработчиками при обработке запросов. Объект Context, который мы используем в обработчиках, реализует интерфейс реестра.

Здесь экземпляр ListableBeanFactory, предоставленный Spring Boot, адаптирован к реестру, чтобы поддерживать реестр в контексте обработчика. Таким образом, когда мы хотим получить объект определенного типа из Context, ListableBeanFactory будет использоваться для поиска соответствующих bean-компонентов.

5. Резюме

В этом руководстве мы рассмотрели, как интегрировать Spring Boot и Ratpack.

Как всегда, полная реализация доступна на Github.