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

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

1. обзор

Ранее мы ввелиRatpack и егоintegration with Google Guice.

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

2. Maven Dependency

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


    io.ratpack
    ratpack-spring-boot-starter
    1.4.6
    pom

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

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

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

@SpringBootApplication
@EnableRatpack
public class EmbedRatpackApp {

    @Autowired
    private Content content;

    @Autowired
    private ArticleList list;

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

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

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

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

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

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

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

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

MainClassApplicationUnderTest appUnderTest
  = new MainClassApplicationUnderTest(EmbedRatpackApp.class);

@Test
public void whenSayHello_thenGotWelcomeMessage() {
    assertEquals("hello example!", 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

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

@Configuration
public class Config {

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

Затем мы можем легко создать реестр, используя удобный метод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, который мы используем в обработчиках, реализует интерфейсRegistry.

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

5. Резюме

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

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