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 .