Рубрики
Без рубрики

Вступление к стартерам весенней загрузки

Краткий обзор наиболее распространенных стартеров Spring Boot, а также примеры их использования в реальном проекте.

Автор оригинала: baeldung.

1. Обзор

Управление зависимостями-важнейший аспект любого сложного проекта. И делать это вручную далеко не идеально; чем больше времени вы потратили на это, тем меньше времени у вас остается на другие важные аспекты проекта.

Стартеры Spring Boot были созданы именно для решения этой проблемы. Стартовые POM-это набор удобных дескрипторов зависимостей, которые вы можете включить в свое приложение. Вы получаете универсальный магазин для всех необходимых вам технологий Spring и связанных с ними технологий, без необходимости искать примеры кода и копировать-вставлять множество дескрипторов зависимостей.

У нас доступно более 30 загрузочных стартеров – давайте рассмотрим некоторые из них в следующих разделах.

2. Веб-стартер

Во – первых, давайте рассмотрим разработку службы REST; мы можем использовать такие библиотеки, как Spring MVC, Tomcat и Jackson-множество зависимостей для одного приложения.

Запуск Spring Boot может помочь уменьшить количество добавляемых вручную зависимостей, просто добавив одну зависимость. Поэтому вместо того, чтобы вручную указывать зависимости, просто добавьте один стартер, как в следующем примере:


    org.springframework.boot
    spring-boot-starter-web

Теперь мы можем создать контроллер REST. Для простоты мы не будем использовать базу данных и сосредоточимся на RestController:

@RestController
public class GenericEntityController {
    private List entityList = new ArrayList<>();

    @RequestMapping("/entity/all")
    public List findAll() {
        return entityList;
    }

    @RequestMapping(value = "/entity", method = RequestMethod.POST)
    public GenericEntity addEntity(GenericEntity entity) {
        entityList.add(entity);
        return entity;
    }

    @RequestMapping("/entity/findby/{id}")
    public GenericEntity findById(@PathVariable Long id) {
        return entityList.stream().
                 filter(entity -> entity.getId().equals(id)).
                   findFirst().get();
    }
}

Сущность Generic представляет собой простой компонент с id типа Long и значением типа String .

Вот и все – с запущенным приложением вы можете получить доступ http://localhost:8080/entity/all и проверьте, работает ли контроллер.

Мы создали приложение REST с довольно минимальной конфигурацией.

3. Тестовый Стартер

Для тестирования мы обычно используем следующий набор библиотек: Spring Test, JUnit, Hamcrest и Mockito. Мы можем включить все эти библиотеки вручную, но Spring Boot starter можно использовать для автоматического включения этих библиотек следующим образом:


    org.springframework.boot
    spring-boot-starter-test
    test

Обратите внимание, что вам не нужно указывать номер версии артефакта. Spring Boot определит, какую версию использовать – все, что вам нужно указать, это версия spring-boot-starter-parent artifact. Если позже вам понадобится обновить библиотеку загрузки и зависимости, просто обновите версию загрузки в одном месте, и она позаботится обо всем остальном.

Давайте на самом деле протестируем контроллер, который мы создали в предыдущем примере.

Существует два способа тестирования контроллера:

  • Использование макетной среды
  • Использование встроенного контейнера сервлетов (например, Tomcat или Jetty)

В этом примере мы будем использовать макет среды:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SpringBootApplicationIntegrationTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    @Before
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect()
      throws Exception { 
        MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
        MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
        mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")).
        andExpect(MockMvcResultMatchers.status().isOk()).
        andExpect(MockMvcResultMatchers.content().contentType(contentType)).
        andExpect(jsonPath("$", hasSize(4))); 
    } 
}

Приведенный выше тест вызывает конечную точку /entity/all и проверяет, что ответ JSON содержит 4 элемента. Чтобы этот тест прошел, мы также должны инициализировать наш список в классе контроллера:

public class GenericEntityController {
    private List entityList = new ArrayList<>();

    {
        entityList.add(new GenericEntity(1l, "entity_1"));
        entityList.add(new GenericEntity(2l, "entity_2"));
        entityList.add(new GenericEntity(3l, "entity_3"));
        entityList.add(new GenericEntity(4l, "entity_4"));
    }
    //...
}

Здесь важно то, что @WebAppConfiguration аннотация и MockMvc являются частью модуля spring-test , имеет размер является сопоставителем Hamcrest и @Before является аннотацией JUnit. Все они доступны при импорте одной этой стартовой зависимости.

4. Стартер данных JPA

Большинство веб – приложений обладают какой-то устойчивостью-и это довольно часто JPA.

Вместо того, чтобы определять все связанные зависимости вручную, давайте вместо этого перейдем к стартеру:


    org.springframework.boot
    spring-boot-starter-data-jpa


    com.h2database
    h2
    runtime

Обратите внимание, что из коробки у нас есть автоматическая поддержка, по крайней мере, следующих баз данных: H2, Derby и Hsqldb. В нашем примере мы будем использовать H2.

Теперь давайте создадим репозиторий для нашей сущности:

public interface GenericEntityRepository extends JpaRepository {}

Пришло время проверить код. Вот тест JUnit:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SpringBootJPATest {
    
    @Autowired
    private GenericEntityRepository genericEntityRepository;

    @Test
    public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() {
        GenericEntity genericEntity = 
          genericEntityRepository.save(new GenericEntity("test"));
        GenericEntity foundedEntity = 
          genericEntityRepository.findOne(genericEntity.getId());
        
        assertNotNull(foundedEntity);
        assertEquals(genericEntity.getValue(), foundedEntity.getValue());
    }
}

Мы не тратили время на указание поставщика базы данных, подключения к URL-адресу и учетных данных. Никакая дополнительная конфигурация не требуется, поскольку мы извлекаем выгоду из твердых настроек загрузки по умолчанию; но, конечно, все эти детали все еще могут быть настроены при необходимости.

5. Стартер Почты

Очень распространенной задачей в развитии предприятия является отправка электронной почты, и работа непосредственно с Java Mail API обычно может быть сложной.

Spring Boot starter скрывает эту сложность – зависимости от почты можно указать следующим образом:


    org.springframework.boot
    spring-boot-starter-mail

Теперь мы можем напрямую использовать JavaMailSender , поэтому давайте напишем несколько тестов.

Для целей тестирования нам нужен простой SMTP-сервер. В этом примере мы будем использовать Wiser. Вот как мы можем включить его в наш POM:


    org.subethamail
    subethasmtp
    3.1.7
    test

Последнюю версию Wiser можно найти в центральном репозитории Maven .

Вот исходный код теста:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SpringBootMailTest {
    @Autowired
    private JavaMailSender javaMailSender;

    private Wiser wiser;

    private String userTo = "[email protected]";
    private String userFrom = "[email protected]";
    private String subject = "Test subject";
    private String textMail = "Text subject mail";

    @Before
    public void setUp() throws Exception {
        final int TEST_PORT = 25;
        wiser = new Wiser(TEST_PORT);
        wiser.start();
    }

    @After
    public void tearDown() throws Exception {
        wiser.stop();
    }

    @Test
    public void givenMail_whenSendAndReceived_thenCorrect() throws Exception {
        SimpleMailMessage message = composeEmailMessage();
        javaMailSender.send(message);
        List messages = wiser.getMessages();

        assertThat(messages, hasSize(1));
        WiserMessage wiserMessage = messages.get(0);
        assertEquals(userFrom, wiserMessage.getEnvelopeSender());
        assertEquals(userTo, wiserMessage.getEnvelopeReceiver());
        assertEquals(subject, getSubject(wiserMessage));
        assertEquals(textMail, getMessage(wiserMessage));
    }

    private String getMessage(WiserMessage wiserMessage)
      throws MessagingException, IOException {
        return wiserMessage.getMimeMessage().getContent().toString().trim();
    }

    private String getSubject(WiserMessage wiserMessage) throws MessagingException {
        return wiserMessage.getMimeMessage().getSubject();
    }

    private SimpleMailMessage composeEmailMessage() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(userTo);
        mailMessage.setReplyTo(userFrom);
        mailMessage.setFrom(userFrom);
        mailMessage.setSubject(subject);
        mailMessage.setText(textMail);
        return mailMessage;
    }
}

В тесте методы @Before и @After отвечают за запуск и остановку почтового сервера.

Обратите внимание, что мы подключаем JavaMailSender bean – боб был автоматически создан Spring Boot .

Как и любые другие настройки по умолчанию в Boot, настройки электронной почты для JavaMailSender можно настроить в application.properties :

spring.mail.host=localhost
spring.mail.port=25
spring.mail.properties.mail.smtp.auth=false

Поэтому мы настроили почтовый сервер на localhost:25 и нам не требовалась аутентификация.

6. Заключение

В этой статье мы дали обзор стартеров, объяснили, зачем они нам нужны, и привели примеры того, как их использовать в ваших проектах.

Давайте подытожим преимущества использования стартеров Spring Boot:

  • повышение управляемости pom
  • готовые к производству, протестированные и поддерживаемые конфигурации зависимостей
  • сократите общее время настройки проекта

Фактический список стартеров можно найти здесь . Исходный код для примеров можно найти здесь .