Перейти к основному содержимому

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

· 3 мин. чтения

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 в наши зависимости. [](https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22ratpack-spring-boot%22) ``

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

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

@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<Chain> может действовать как веб-фильтр и/или контроллер.

Когда дело доходит до обслуживания статических файлов, 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 foreach!", 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 foreach!";
}
}

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

5. Резюме

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

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