Интеграция 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.