Introduction aux démarreurs de printemps

Introduction aux démarreurs de printemps

1. Vue d'ensemble

La gestion de la dépendance est un aspect critique de tout projet complexe. Et le faire manuellement n’est pas idéal; plus vous y avez consacré de temps, moins vous avez de temps pour les autres aspects importants du projet.

Les démarreurs Spring Boot ont été conçus pour résoudre exactement ce problème. Les POM de démarrage sont un ensemble de descripteurs de dépendance pratiques que vous pouvez inclure dans votre application. Vous disposez d'un guichet unique pour toutes les technologies Spring et les technologies connexes dont vous avez besoin, sans avoir à parcourir un échantillon de code et à copier-coller des charges de descripteurs de dépendance.

Nous avons plus de 30 démarreurs de démarrage disponibles - voyons certains d’entre eux dans les sections suivantes.

2. Le Web Starter

Commençons par le développement du service REST; nous pouvons utiliser des bibliothèques comme Spring MVC, Tomcat et Jackson - beaucoup de dépendances pour une seule application.

Les démarreurs Spring Boot peuvent aider à réduire le nombre de dépendances ajoutées manuellement en ajoutant simplement une dépendance. Donc, au lieu de spécifier manuellement les dépendances, ajoutez simplement un démarreur comme dans l'exemple suivant:


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

Nous pouvons maintenant créer un contrôleur REST. Par souci de simplicité, nous n'utiliserons pas la base de données et nous nous concentrerons sur le contrôleur REST:

@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();
    }
}

LeGenericEntity est un simple bean avecid de typeLong etvalue de typeString.

Voilà - avec l'application en cours d'exécution, vous pouvez accéder àhttp://localhost:8080/entity/all et vérifier que le contrôleur fonctionne.

Nous avons créé une application REST avec une configuration assez minimale.

3. Le démarreur de test

Pour les tests, nous utilisons généralement le jeu de bibliothèques suivant: Spring Test, JUnit, Hamcrest et Mockito. Nous pouvons inclure toutes ces bibliothèques manuellement, mais Spring Boot starter peut être utilisé pour inclure automatiquement ces bibliothèques de la manière suivante:


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

Notez que vous n'avez pas besoin de spécifier le numéro de version d'un artefact. Spring Boot déterminera la version à utiliser - tout ce que vous devez spécifier est la version de l'artefactspring-boot-starter-parent. Si, par la suite, vous devez mettre à niveau la bibliothèque de démarrage et ses dépendances, il suffit de mettre à niveau la version de démarrage à un endroit et le reste sera pris en charge.

Testons en fait le contrôleur que nous avons créé dans l'exemple précédent.

Il existe deux manières de tester le contrôleur:

  • Utiliser l'environnement fictif

  • Utilisation du conteneur Servlet intégré (comme Tomcat ou Jetty)

Dans cet exemple, nous utiliserons un environnement simulé:

@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)));
    }
}

Le test ci-dessus appelle le point de terminaison/entity/all et vérifie que la réponse JSON contient 4 éléments. Pour que ce test réussisse, nous devons également initialiser notre liste dans la classe du contrôleur:

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"));
    }
    //...
}

Ce qui est important ici, c'est que l'annotation@WebAppConfiguration etMockMVC font partie du modulespring-test,hasSize est un matcher Hamcrest et@Before est une annotation JUnit. Ceux-ci sont tous disponibles en important une dépendance de démarrage.

4. Le Data JPA Starter

La plupart des applications Web ont une sorte de persistance - et c'est assez souvent JPA.

Au lieu de définir manuellement toutes les dépendances associées, allons-y plutôt avec le démarreur:


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


    com.h2database
    h2
    runtime

Notez que nous avons immédiatement pris en charge le support automatique pour les bases de données suivantes: H2, Derby et Hsqldb. Dans notre exemple, nous utiliserons H2.

Créons maintenant le référentiel de notre entité:

public interface GenericEntityRepository extends JpaRepository {}

Il est temps de tester le code. Voici le test 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());
    }
}

Nous n'avons pas passé de temps à spécifier le fournisseur de la base de données, la connexion URL et les informations d'identification. Aucune configuration supplémentaire n'est nécessaire car nous bénéficions des solides valeurs par défaut de Boot; mais bien sûr, tous ces détails peuvent toujours être configurés si nécessaire.

5. Le Mail Starter

L'envoi de courrier électronique est une tâche très courante dans le développement d'entreprise. Traiter directement avec l'API Java Mail peut généralement s'avérer difficile.

Spring Bootter cache cette complexité - les dépendances de courrier peuvent être spécifiées de la manière suivante:


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

Nous pouvons maintenant utiliser directement lesJavaMailSender, alors écrivons quelques tests.

Pour les besoins du test, nous avons besoin d’un simple serveur SMTP. Dans cet exemple, nous utiliserons Wiser. Voici comment nous pouvons l'inclure dans notre POM:


    org.subethamail
    subethasmtp
    3.1.7
    test

La dernière version de Wiser est disponible surMaven central repository.

Voici le code source du test:

@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;
    }
}

Dans le test, les méthodes@Before et@After sont chargées de démarrer et d'arrêter le serveur de messagerie.

Notez que nous câblons dans le beanJavaMailSender - le bean étaitautomatically created by Spring Boot.

Comme toutes les autres valeurs par défaut dans Boot, les paramètres de messagerie pour lesJavaMailSender peuvent être personnalisés dansapplication.properties:

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

Nous avons donc configuré le serveur de messagerie surlocalhost:25 et nous n’avons pas demandé d’authentification.

6. Conclusion

Dans cet article, nous avons donné un aperçu des démarreurs, expliqué pourquoi nous en avons besoin et donné des exemples sur la manière de les utiliser dans vos projets.

Récapitulons les avantages de l'utilisation des démarreurs Spring Boot:

  • augmenter la facilité de gestion des pom

  • configurations de dépendance prêtes pour la production, testées et prises en charge

  • diminuer le temps de configuration global du projet

La liste actuelle des démarreurs peut être trouvéehere. Le code source des exemples peut être trouvéhere.