<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spring on Java &amp; Moi</title><link>https://javaetmoi.com/categories/spring/</link><description>Recent content in Spring on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Mon, 06 Apr 2026 13:26:43 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/categories/spring/feed.xml" rel="self" type="application/rss+xml"/><item><title>Découverte de Spring Modulith</title><link>https://javaetmoi.com/2026/04/decouverte-de-spring-modulith/</link><pubDate>Mon, 06 Apr 2026 13:26:43 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2642</guid><description>&lt;p&gt;En 2025, j’ai eu l’opportunité de mettre en place &lt;a href="https://spring.io/projects/spring-modulith"&gt;&lt;strong&gt;Spring Modulith&lt;/strong&gt;&lt;/a&gt; sur une nouvelle application web. Pour partager cette expérience avec mes collègues, j’ai préparé une démonstration live montrant comment intégrer Spring Modulith dans une application Spring Boot.&lt;/p&gt;
&lt;p&gt;J’avais besoin pour cela d’une application simple et universelle. Vous commencez à me connaitre : mon choix s’est naturellement porté sur la version canonique de &lt;strong&gt;Spring Petclinic&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pris au jeu, j’ai progressivement enrichi l’application afin d’illustrer plusieurs fonctionnalités clés de Spring Modulith. J’ai ensuite mis ce fork à disposition de la communauté Spring Petclinic dont le code source complet est disponible sur GitHub : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-modulith"&gt;spring-petclinic-modulith&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans ce billet, je vous propose de découvrir Spring Modulith, puis de suivre pas à pas comment l’application démo Spring Petclinic a été enrichie pour tirer parti de ses fonctionnalités.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Bannière Spring PetClinic Modulith"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2026/04/banner-spring-petclinic-modulith.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>De Spring Data JPA à jOOQ</title><link>https://javaetmoi.com/2025/06/de-spring-data-jpa-a-jooq/</link><pubDate>Mon, 16 Jun 2025 06:57:01 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2580</guid><description>&lt;p&gt;Lors de la conférence Devoxx France 2025, j’ai participé à un hands-on lab de 2h intitulé &lt;a href="https://www.devoxx.fr/agenda-2025/talk/sortir-des-orms-avec-jooq/"&gt;Sortir des ORMs avec jOOQ&lt;/a&gt;. Acronyme de « &lt;strong&gt;Java Object Oriented Querying&lt;/strong&gt; », &lt;strong&gt;jOOQ&lt;/strong&gt; se présente comme une &lt;strong&gt;alternative à JPA&lt;/strong&gt; permettant d’ &lt;strong&gt;écrire des requêtes SQL&lt;/strong&gt; en Java via une &lt;strong&gt;fluent API&lt;/strong&gt;. Animé par Sylvain Decout et Samuel Lefebvre, cet atelier visait à migrer une application Spring Boot / JPA vers jOOQ à l’aide du &lt;strong&gt;starter Spring Boot&lt;/strong&gt; pour jOOQ. Pour les curieux, le repo de l’atelier est disponible sur Github : &lt;a href="https://github.com/sylvaindecout/jooq-handson"&gt;jooq-handson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fort de cette découverte, je me suis à mon tour prêté à l’exercice de migrer vers jOOQ la couche de persistance Spring Data JPA de l’application démo Spring Petclinic. Un nouveau fork est né : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-jooq"&gt;&lt;strong&gt;spring-petclinic-jooq&lt;/strong&gt;&lt;/a&gt;. Bienvenue à ce dernier dans la communauté Spring Petclinic.&lt;/p&gt;
&lt;p&gt;L’usage de jOOQ se rapproche de l’utilisation de JdbcTemplate. Le développeur maitrise le nombre de requêtes envoyées à la base de données relationnelle. Ce qui les différencie, c’est la syntaxe : pas de SQL, mais une &lt;strong&gt;API Java fluide&lt;/strong&gt; et &lt;strong&gt;type-safe&lt;/strong&gt; spécifique à jOOQ qu’il va falloir appréhender. Rassurez-vous, cette API se rapproche du SQL : on y retrouve les mots clés &lt;strong&gt;select&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt;, &lt;strong&gt;insertInto&lt;/strong&gt;, &lt;strong&gt;where&lt;/strong&gt;, &lt;strong&gt;from&lt;/strong&gt;, &lt;strong&gt;join&lt;/strong&gt;, &lt;strong&gt;on&lt;/strong&gt;, &lt;strong&gt;as&lt;/strong&gt;… A ceux-ci, on ajoute des mots clés spécifiques à jOOQ : &lt;strong&gt;paginate&lt;/strong&gt;, &lt;strong&gt;fetch&lt;/strong&gt;, &lt;strong&gt;convertFrom&lt;/strong&gt; … La &lt;a href="https://www.jooq.org/learn/"&gt;&lt;strong&gt;documentation&lt;/strong&gt;&lt;/a&gt; de jOOQ est très &lt;strong&gt;complète&lt;/strong&gt;. On y apprend comment écrire des requêtes complexes à base de window function ou de Common Table Expressions (CTE) et comment utiliser des fonctionnalités avancées de SQL que peu de frameworks ORM supportent nativement : &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/json-functions/"&gt;JSON functions&lt;/a&gt;, &lt;a href="https://blog.jooq.org/how-to-use-sql-pivot-to-compare-two-tables-in-your-database/"&gt;PIVOT&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/merge-statement/"&gt;MERGE&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/select-statement/set-operations/set-operation-union/"&gt;UNION&lt;/a&gt; …&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif d’expliquer les &lt;strong&gt;étapes&lt;/strong&gt; adoptées pour &lt;strong&gt;migrer l’implémentation Spring Data JPA des repository vers jOOQ&lt;/strong&gt;. Des exemples de code avant / après y sont proposés.&lt;/p&gt;</description></item><item><title>Optimisez vos applications Spring Boot avec CDS et le projet Leyden</title><link>https://javaetmoi.com/2025/04/optimisez-vos-applications-spring-boot-avec-cds-et-le-projet-leyden/</link><pubDate>Mon, 21 Apr 2025 12:04:33 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2482</guid><description>&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2025&lt;/a&gt;&lt;br&gt;
Date : 17 avril 2025&lt;br&gt;Speaker : &lt;a href="https://seb.deleuze.fr/"&gt;Sébastien Deleuze&lt;/a&gt; (Broadcom)&lt;br&gt;
Format : Conférence (45 mn) / &lt;a href="https://www.youtube.com/watch?v=4EAxhhSWgw4"&gt;Replay Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sébastien est Core Commiter sur &lt;a href="https://spring.io/projects/spring-framework"&gt;Spring Framework&lt;/a&gt;.
Il intervient également sur des sujets transverses au portfolio Spring : support de Kotlin, null-safety (avec &lt;a href="https://jspecify.dev/"&gt;JSpecify&lt;/a&gt;) et les sujets d’optimisation.
Dans ce talk, il a pour ambition de nous montrer &lt;strong&gt;comment améliorer l’efficacité de 80% des applications Spring&lt;/strong&gt;, que ce soit de nouvelles applications ou des applications Legacy.&lt;/p&gt;
&lt;p&gt;Les raisons d’améliorer l’efficacité de nos applications sont multiples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Baisser le cout&lt;/strong&gt; de run des applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Développement durable&lt;/strong&gt; pour diminuer la consommation d’énergie, de mémoire et de CPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimiser&lt;/strong&gt; les applications pour les &lt;strong&gt;containers&lt;/strong&gt; (sur le Cloud ou OnPremise)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour arriver à nos fins, Sébastien nous propose 3 technologies :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CDS&lt;/strong&gt; : techno relativement vieille mais qui s’est améliorée au fil des versions de Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AOT cache&lt;/strong&gt; : Java 24 permet d’utiliser l’AOT cache qui est une version améliorée CDS. Sébastien prédit l’exploision de AOT Cache avec la LTS Java 25&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AOT cache with profiling&lt;/strong&gt; : technologie expérimentale et prometeuse&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Sébastien Deleuze at Devoxx France 2025"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/04/word-image-2482-1.jpeg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Spring Petclinic sous extensions Quarkus</title><link>https://javaetmoi.com/2025/04/spring-petclinic-sous-extensions-quarkus/</link><pubDate>Sun, 13 Apr 2025 16:55:14 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2443</guid><description>&lt;p&gt;Spring et Quarkus dans le même repository Git, ou presque. Cela vous intrigue ? &lt;br&gt;Figurez-vous qu’il y’a quelques mois, la lecture du très bon &lt;strong&gt;livre &lt;a href="https://agoncal.teachable.com/p/ebook-understanding-quarkus"&gt;Understanding Quarkus 2.x&lt;/a&gt;&lt;/strong&gt; d’Antonio Gongalves m’a donné envie de pratiquer ce framework alternatif à Spring Boot. Et pour apprendre une nouvelle technologie, quoi de plus stimulant que de se fixer un objectif. Je me suis donc donné comme challenge de migrer vers Quarkus l’application démo Spring Boot que je connais bien. Une fois migrée, l’application devait rester &lt;strong&gt;iso-fonctionnelle&lt;/strong&gt;. &lt;br&gt;A travers leur repo &lt;a href="https://github.com/redhat-developer-demos/quarkus-petclinic"&gt;quarkus-petclinic&lt;/a&gt;, RedHat avait fait l’exercice avant moi. Malheureusement, l’historique Git a été écrasé, ne laissant aucune trace du chemin de migration parcouru. Pendant 3 mois, j&amp;rsquo;ai donc travaillé sur un nouveau fork que je suis fier de vous présenter : &lt;a href="https://github.com/arey/quarkus-spring-petclinic"&gt;&lt;strong&gt;quarkus-spring-petclinic&lt;/strong&gt;&lt;/a&gt;. Ajouté à la communauté Spring Petclinic, ce fork a un double objectif :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Montrer comment &lt;strong&gt;migrer une application Spring Boot 3.4 vers Quarkus 3.21&lt;/strong&gt;, avec le minium d&amp;rsquo;effort et en modifiant le moins de code possible&lt;/li&gt;
&lt;li&gt;Utiliser les &lt;strong&gt;extensions Spring&lt;/strong&gt; proposées par &lt;strong&gt;Quarkus&lt;/strong&gt; pour garder un lien avec le monde Spring tout en soulignant l&amp;rsquo;effort de l&amp;rsquo;équipe Quarkus pour supporter Spring, un framework incontournable de l&amp;rsquo;écosystème Java&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Les &lt;strong&gt;extensions Spring pour Quarkus&lt;/strong&gt; utilisées sont au nombre de quatre : &lt;strong&gt;Spring DI&lt;/strong&gt;, &lt;strong&gt;Spring Web&lt;/strong&gt;, &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;Spring Cache&lt;/strong&gt;.&lt;br&gt;Le changement majeur aura été de porter le templating des pages HTML de &lt;strong&gt;Thymeleaf&lt;/strong&gt; vers &lt;strong&gt;Qute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Débutant en Quarkus, le code proposé ne respecte peut-être pas toutes les règles de l’art prônées par l’équipe de dév Quarkus. Je m’en excuse par avance. Si vous voulez contribuer et corriger le tir : &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/issues"&gt;issue&lt;/a&gt; et &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/pulls"&gt;Pull Request&lt;/a&gt; sont les bienvenues.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="https://github.com/spring-petclinic/quarkus-spring-petclinic/compare/spring-boot-version...v3.21.0"&gt;différenciel complet&lt;/a&gt; entre la version Spring Boot et la version Quarkus de Petclinic peut-être visualisé sur Github.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=" "
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2025/04/word-image-2443-1.png"
title=" "
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Intégrer un Chatbot dans une webapp Java avec LangChain4j</title><link>https://javaetmoi.com/2024/11/integrer-un-chatbot-dans-une-webapp-java-avec-langchain4j/</link><pubDate>Mon, 11 Nov 2024 18:34:24 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2391</guid><description>&lt;p&gt;Cet article explique comment intégrer un &lt;strong&gt;chatbot&lt;/strong&gt; utilisant l’ &lt;strong&gt;IA générative&lt;/strong&gt; dans une &lt;strong&gt;application de gestion&lt;/strong&gt; codée en &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nous nous appuierons sur le framework Open Source &lt;a href="https://docs.langchain4j.dev/"&gt;&lt;strong&gt;LangChain4j&lt;/strong&gt;&lt;/a&gt;, une adaptation Java de la célèbre librairie python LangChain,
visant à simplifier l&amp;rsquo;intégration de grands modèles de langage ( &lt;strong&gt;LLM&lt;/strong&gt;). LangChain4j permet de créer des &lt;strong&gt;agents conversationnels&lt;/strong&gt;, des &lt;strong&gt;assistants virtuels&lt;/strong&gt; (comme notre chatbot),
ou des applications capables d&amp;rsquo;effectuer des &lt;strong&gt;analyses de texte&lt;/strong&gt; et de répondre en fonction de données contextuelles, le tout sans devoir écrire de code complexe et avec un &lt;strong&gt;haut niveau d’abstraction&lt;/strong&gt;.
Elle facilite notamment l&amp;rsquo;utilisation des API des Large Langage Model comme &lt;a href="https://docs.langchain4j.dev/integrations/language-models/open-ai"&gt;OpenAI&lt;/a&gt; et &lt;a href="https://docs.langchain4j.dev/integrations/language-models/hugging-face"&gt;Hugging Face&lt;/a&gt;,
et propose différents connecteurs pour des bases de données vectorielles, incluant &lt;a href="https://docs.langchain4j.dev/integrations/embedding-stores/elasticsearch"&gt;Elasticsearch&lt;/a&gt; et &lt;a href="https://docs.langchain4j.dev/integrations/embedding-stores/qdrant"&gt;Qdrant&lt;/a&gt;.
Pour accélérer son intégration, LangChain4j propose des extensions pour &lt;strong&gt;Quarkus&lt;/strong&gt; et des starters pour &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour illustrer cet article, nous utiliserons l’illustre application démo &lt;strong&gt;Spring Petclinic&lt;/strong&gt; et son récent fork dédié à LangChain4j : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-langchain4j"&gt;&lt;strong&gt;spring-petclinic-langchain4j&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;Propulsé par Spring Boot, Spring Petclinic s’appuie sur &lt;strong&gt;Spring Data JPA&lt;/strong&gt; pour l’accès aux données et &lt;strong&gt;Thymeleaf&lt;/strong&gt; pour la couche présentation HTML / CSS / JavaScript.&lt;br&gt;En septembre 2024, Oded Shopen, contributeur en 2020 du fork &lt;a href="https://github.com/spring-petclinic/spring-petclinic-cloud/"&gt;Spring Petclinic Cloud&lt;/a&gt;, &lt;a href="https://spring.io/blog/2024/09/26/ai-meets-spring-petclinic-implementing-an-ai-assistant-with-spring-ai-part-i"&gt;a proposé une intégration de Spring AI dans Spring Petclinic&lt;/a&gt;. De son travail, est né le projet &lt;a href="https://github.com/spring-petclinic/spring-petclinic-ai"&gt;spring-petclinic-ai&lt;/a&gt;. Le repository &lt;a href="https://github.com/spring-petclinic/spring-petclinic-langchain4j"&gt;spring-petclinic-langchain4j&lt;/a&gt; est un &lt;strong&gt;portage&lt;/strong&gt; du framework &lt;strong&gt;&lt;a href="https://spring.io/projects/spring-ai/"&gt;Spring AI&lt;/a&gt;&lt;/strong&gt; vers &lt;strong&gt;LangChain4j&lt;/strong&gt;. Y a été ajouté notamment une fonctionnalité de &lt;strong&gt;streaming&lt;/strong&gt;.&lt;br&gt;Extraits du sample, les exemples de code s’appuient sur les versions 3.3 de Spring Boot et &lt;strong&gt;0.35.0 de LangChaing4j&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=" "
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2024/11/langchain4j-question-llm.png"
title=" "
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>L’Architecture Hexagonale par la pratique</title><link>https://javaetmoi.com/2024/04/larchitecture-hexagonale-par-la-pratique/</link><pubDate>Sun, 21 Apr 2024 16:38:47 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2317</guid><description>&lt;h2 id="le-live-coding-qui-rendra-vos-applications-plus-pérennes"&gt;Le live coding qui rendra vos applications plus pérennes&lt;/h2&gt;
&lt;p&gt;Conférence : &lt;a href="https://www.devoxx.fr/"&gt;Devoxx France 2024&lt;/a&gt;&lt;br&gt;Date : 19 avril 2024 &lt;br&gt;Speakers : &lt;a href="https://twitter.com/JulienTopcu"&gt;Julien Topçu&lt;/a&gt; ( &lt;a href="https://shodo.io/"&gt;Shodo&lt;/a&gt;) &lt;br&gt;Format : Conférence (45mn) &lt;br&gt;Repo GitLab : &lt;a href="https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot"&gt;https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot&lt;/a&gt;&lt;br&gt;Vidéo Youtube : &lt;a href="https://www.youtube.com/watch?v=-dXN8wkN0yk"&gt;https://www.youtube.com/watch?v=-dXN8wkN0yk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cette session de live coding se déroule dans l’univers de Starwars et commence par une &lt;strong&gt;citation de Maitre Yoda&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En 45mn, Julien doit développer le système &lt;strong&gt;Rebels Rescue&lt;/strong&gt; visant à reconstituer des flottes de sauvetage. N’en déplaise à l’Empire, les technos seront Spring Boot et Java 21.&lt;/p&gt;
&lt;p&gt;A cet effet, il s’appuiera sur l’API publique &lt;a href="https://swapi.dev/"&gt;SWAPI&lt;/a&gt; permettant d’accéder à un référentiel de vaisseaux à disposition. L’application sélectionne les vaisseaux qui permettent d’effectuer la mission de sauvetage. Le code source est disponible dans le repo GitLab de Julien : &lt;a href="https://gitlab.com/beyondxscratch/hexagonal-architecture-java-springboot"&gt;hexagonal-architecture-java-springboot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Julien commence par rappeler les inconvénients d’une &lt;strong&gt;architecture 3-tiers&lt;/strong&gt; basée sur le triptyque &lt;strong&gt;Contrôleur -&amp;gt; Service -&amp;gt; Persistance&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Générateur de squelette d’application basé sur Spring Initializr</title><link>https://javaetmoi.com/2022/07/generateur-de-squelette-dapplication-base-sur-spring-initializr/</link><pubDate>Sun, 03 Jul 2022 12:25:17 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2217</guid><description>&lt;p&gt;Dans une &lt;strong&gt;grande entreprise&lt;/strong&gt;, le &lt;strong&gt;développement d’applications métiers&lt;/strong&gt; doit respecter les &lt;strong&gt;règles&lt;/strong&gt; en vigueur : normes de développement, normes de sécurité, barrière qualité, socle technique borné, intégration à l’usine de dév …&lt;br&gt;Le &lt;strong&gt;démarrage d’une nouvelle application Java&lt;/strong&gt; peut être accélérée de bien des manières : usage d’outils Low Code comme &lt;a href="https://www.vermeg.com/fr/produit-palmyra/"&gt;Palmyra&lt;/a&gt;, générateur de squelettes d’application comme &lt;a href="https://www.jhipster.tech/"&gt;JHipster&lt;/a&gt;, utilisation d’applications blanches déclinées par catégorie d’appli (ex : batch, web), copier/coller/élagage d’une application de référence, guide de démarrage sous forme wiki … Chaque technique présente ses avantages et ses inconvénients. Mais certaines ne couvrent pas toutes les règles évoquées précédemment.&lt;br&gt;Afin d’ &lt;strong&gt;accélérer le développement&lt;/strong&gt; d’une nouvelle application, mon objectif était de générer un &lt;strong&gt;squelette d’application minimaliste&lt;/strong&gt; dont le code généré est parfaitement maitrisé et avec des &lt;strong&gt;dépendances choisies à la carte&lt;/strong&gt; par le tech lead. Libre à lui ensuite de retravailler le code généré pour mettre en place l’architecture cible de l’application, en choisissant par exemple de partir sur une architecture hexagonale.&lt;/p&gt;
&lt;p&gt;Bien connu des développeurs Spring Boot, je me suis appuyé sur le code backend faisant tourner le site &lt;a href="https://start.spring.io/"&gt;https://start.spring.io/&lt;/a&gt;, à savoir le projet &lt;strong&gt;&lt;a href="https://github.com/spring-io/initializr"&gt;Spring Initializr&lt;/a&gt;&lt;/strong&gt; conçu et maintenu majoritairement par Stéphane Nicoll. Léger, codé en Java, reposant sur Spring Boot et documenté, ce projet a été conçu pour être personnalisé et extensible. Cela en a fait un excellent candidat.&lt;br&gt;La première mouture de ce générateur développé en quelques jours m’aura permis de générer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la configuration du socle Spring Boot d’entreprise&lt;/li&gt;
&lt;li&gt;la configuration du logger permettant de standardiser les logs au format JSON&lt;/li&gt;
&lt;li&gt;la sécurisation des API REST avec Spring Security, OpenID Connect et le SSO d’entreprise&lt;/li&gt;
&lt;li&gt;les contrôleurs et DTO d’une API REST à partir d’une spécification OpenAPI 3&lt;/li&gt;
&lt;li&gt;le Dockerfile et la configuration du pipeline CI/CD&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Configuration Spring Security d’un client de l’API REST Salesforce sécurisée avec OAuth 2.0</title><link>https://javaetmoi.com/2021/11/configuration-spring-security-dun-client-de-lapi-rest-salesforce-securisee-avec-oauth-2-0/</link><pubDate>Sat, 06 Nov 2021 16:53:05 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2138</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;De nos jours, il est courant de devoir &lt;strong&gt;consommer&lt;/strong&gt; une &lt;strong&gt;API REST sécurisée&lt;/strong&gt; à l’aide du standard &lt;strong&gt;OAuth 2.0&lt;/strong&gt; ou de sa surcouche &lt;strong&gt;OpenID Connect&lt;/strong&gt; (OIDC). &lt;br&gt;Schématiquement, le consommateur génère un &lt;strong&gt;jeton (token)&lt;/strong&gt; opaque ou JWT en appelant un serveur d’autorisation (Authorization server) puis, à chaque appel d’API REST, le transmet en tant que bearer via l’ &lt;strong&gt;en-tête HTTP&lt;/strong&gt; &lt;strong&gt;Authorization&lt;/strong&gt;. Ce token a souvent une &lt;strong&gt;durée de vie&lt;/strong&gt; transmise par le serveur d’autorisation via la propriété &lt;strong&gt;expires_in&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;OAuth 2.0 propose quatre cinématiques (flows), la plus commune étant l’Authorization Code Flow. Lorsque l’API REST est appelée depuis une application web, il est courant de voir utiliser le Client Credentials Flow ou le &lt;strong&gt;&lt;a href="https://www.oreilly.com/library/view/getting-started-with/9781449317843/ch04.html"&gt;Resource&lt;/a&gt;&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://www.oreilly.com/library/view/getting-started-with/9781449317843/ch04.html"&gt;Owner Password Credentials Flow&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Récemment, j’ai été amené à &lt;strong&gt;consommer l’API REST du&lt;/strong&gt; &lt;strong&gt;CRM Salesforce&lt;/strong&gt; &lt;strong&gt;depuis une application Spring Boot&lt;/strong&gt;. Cette API était sécurisée avec le Resource Owner password Credentials Flow. Salesforce joue à la fois le rôle de l’Authorization Server et du Resource Owner. Le client (l’application Spring Boot) transmet ses &lt;strong&gt;credentials&lt;/strong&gt; (login et mot de passe) à l’Authorization Server pour obtenir un &lt;strong&gt;Access Token&lt;/strong&gt;. &lt;br&gt;Cet article a pour objectif de vous présenter la &lt;strong&gt;configuration Spring Security&lt;/strong&gt; mise en œuvre pour appeler cette API. Les extraits de code proviennent du repository GitHub &lt;a href="https://github.com/arey/spring-security-oauth2-salesforce-sample"&gt;&lt;strong&gt;arey/spring-security-oauth2-salesforce-sample&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Désendettement de Spring Cloud Netflix</title><link>https://javaetmoi.com/2019/11/desendettement-de-spring-cloud-netflix/</link><pubDate>Thu, 28 Nov 2019 08:37:31 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2045</guid><description>&lt;p&gt;&lt;a href="https://javaetmoi.com/wp-content/uploads/2019/11/spring-cloud-netflix.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_external image_processed"
width="225"
height="225"
src="https://javaetmoi.com/spring-cloud-netflix_1305183779605428790.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;Le projet &lt;a href="https://spring.io/projects/spring-cloud-netflix"&gt;Spring Cloud Netflix&lt;/a&gt; facilite l’intégration de différents projets de la suite &lt;a href="https://netflix.github.io/"&gt;Netflix OSS&lt;/a&gt; dans des applications Spring Boot / Spring Cloud : Eureka, Zuul 1, Ribbon, Hystrix, Archaius, Feign. Jusqu’en 2018, le projet &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices"&gt;Spring Petclinic Microservices&lt;/a&gt; dont j’assure la maintenance utilisait ces 4 premiers projets.&lt;/p&gt;
&lt;p&gt;Or, certains des projets historiques de Netflix OSS ne sont plus activement développés. Ils sont rentrés en mode maintenance. C’est notamment le cas d’ &lt;a href="https://github.com/Netflix/Hystrix#hystrix-status"&gt;Hystrix&lt;/a&gt;, de Zuul 1 et de Ribbon. En décembre 2018, lors de l’annonce de la &lt;a href="https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now"&gt;sortie de Spring Cloud Greenwich RC1&lt;/a&gt;, Pivotal recommande de migrer vers des projets tiers et de nouveaux modules Spring Cloud :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anciennement****Solutions cibles&lt;/strong&gt; Hystrix &lt;a href="https://github.com/resilience4j/resilience4j"&gt;Resilience4j&lt;/a&gt;Hystrix Dashboard / Turbine &lt;a href="https://micrometer.io/"&gt;Micrometer&lt;/a&gt; + Monitoring System Ribbon &lt;a href="https://cloud.spring.io/spring-cloud-static/spring-cloud-commons/2.2.0.RC2/reference/html/#spring-cloud-loadbalancer"&gt;Spring Cloud Loadbalancer&lt;/a&gt; Zuul 1 &lt;a href="https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.RC2/reference/html/"&gt;Spring Cloud Gateway&lt;/a&gt; Archaius 1 Spring Boot external config + Spring Cloud Config&lt;/p&gt;
&lt;p&gt;Dans le cadre de Spring Petclinic Microservices, seul Eureka est épargné et continue de jouer son rôle d’annuaire de service. Un désendettement vers &lt;strong&gt;Resilience4j&lt;/strong&gt;, &lt;strong&gt;Micrometer&lt;/strong&gt;, &lt;strong&gt;Spring Cloud Loadbalancer&lt;/strong&gt; et &lt;strong&gt;Spring Cloud Gateway&lt;/strong&gt; s’est naturellement imposé (issue &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices/issues/117"&gt;#117&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Cet article retrace les différentes étapes de
migration. J’espère qu’il vous sera utile si vous avez le même chemin à
parcourir.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Désendettement de Spring Cloud Netflix"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2019/11/spring-cloud-netflix.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Architecture Microservices avec Spring Cloud</title><link>https://javaetmoi.com/2018/10/architecture-microservices-avec-spring-cloud/</link><pubDate>Thu, 04 Oct 2018 05:58:31 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1869</guid><description>&lt;p&gt;Dans ce billet, j’aimerais vous présenter les différentes briques techniques permettant de mettre en œuvre une &lt;a href="https://martinfowler.com/articles/microservices.html"&gt;&lt;strong&gt;architecture microservices&lt;/strong&gt;&lt;/a&gt; reposant sur &lt;strong&gt;Spring Boot&lt;/strong&gt;, &lt;strong&gt;Spring Cloud&lt;/strong&gt;, &lt;strong&gt;Netflix OSS&lt;/strong&gt; et &lt;strong&gt;Docker&lt;/strong&gt;. Pour m’y aider, je m’appuierai sur l’application démo &lt;a href="https://github.com/spring-petclinic/spring-petclinic-microservices"&gt;&lt;strong&gt;Spring Petclinic Microservices&lt;/strong&gt;&lt;/a&gt; que je vous avais déjà brièvement présenté &lt;a href="http://javaetmoi.com/2016/12/les-forks-de-spring-petclinic/"&gt;en 2016&lt;/a&gt; et que j’ai récemment migrée vers Spring Cloud Finchley et Spring Boot 2.&lt;/p&gt;
&lt;p&gt;Ce fork a été construit à partir de l’application monolithique &lt;a href="https://github.com/spring-petclinic/spring-petclinic-angularjs"&gt;spring-petclinic-angularjs&lt;/a&gt;. Cette dernière a été découpée en plusieurs services, chacun responsable d’un domaine métier de la clinique vétérinaire : les animaux et leurs propriétaires, leurs visites à la clinique et les vétérinaires.&lt;/p&gt;
&lt;p&gt;Au final, Spring Petclinic Microservices est construit autour de &lt;strong&gt;petits services indépendants&lt;/strong&gt; (quelques centaines de ligne de code), s’exécutant dans &lt;strong&gt;leur propre JVM&lt;/strong&gt; et communiquant sur HTTP via une &lt;strong&gt;API&lt;/strong&gt; &lt;strong&gt;REST&lt;/strong&gt;.
Ces microservices sont tous écrits en &lt;strong&gt;Java&lt;/strong&gt;. Mais on aurait pu utiliser &lt;strong&gt;Kotlin&lt;/strong&gt; pour développer certains d’entre eux. Le front est quant à lui codé en &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="architecture-technique"&gt;Architecture technique&lt;/h2&gt;
&lt;p&gt;Pour fonctionner, les différents microservices composant l’application Petclinic reposent sur différentes briques techniques matérialisées sur le diagramme d’architecture ci-dessous :&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2018/09/Diapositive1.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/09/2018-08-24-Architecture-microservices-avec-Spring-Cloud.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2018-08-24-Architecture-microservices-avec-Spring-Cloud"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2018/09/2018-08-24-Architecture-microservices-avec-Spring-Cloud.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Migration Spring MVC vers Spring WebFlux</title><link>https://javaetmoi.com/2017/12/migration-spring-web-mvc-vers-spring-webflux/</link><pubDate>Thu, 07 Dec 2017 17:26:12 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1794</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2017/12/spring-webflux.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/12/spring-webflux.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;a href="https://docs.spring.io/spring-framework/docs/5.0.1.RELEASE/spring-framework-reference/web-reactive.html#spring-webflux"&gt;&lt;strong&gt;Spring WebFlux&lt;/strong&gt;&lt;/a&gt; est une &lt;strong&gt;fonctionnalit&lt;/strong&gt; &lt;strong&gt;é majeure&lt;/strong&gt; de &lt;strong&gt;Spring Framework 5&lt;/strong&gt;. Disposant de son propre module Maven (spring-weblux), ce &lt;strong&gt;nouveau framework web&lt;/strong&gt; se positionne comme une &lt;strong&gt;alternative&lt;/strong&gt; &lt;strong&gt;à Spring Web MVC.&lt;/strong&gt; Ce dernier a été conçu par-dessus l’API Servlet. Spring WebFlux l’a été pour les &lt;strong&gt;applications r&lt;/strong&gt; &lt;strong&gt;éactives&lt;/strong&gt;, avec I/O non bloquantes, asynchrones, &lt;strong&gt;à faible latence&lt;/strong&gt;, basées sur des serveurs comme Netty, Undertow ou compatibles Servlets 3.1 et +.
Spring WebFlux s’éloigne du modèle d’un thread par requête HTTP et se base désormais sur le projet &lt;a href="https://projectreactor.io/"&gt;&lt;strong&gt;Reactor&lt;/strong&gt;&lt;/a&gt; pour orchestrer le traitement des requêtes.
Conçu avant tout pour exposer des &lt;strong&gt;API REST&lt;/strong&gt; attaquant des bases NoSQL non bloquantes dans des architecture micro-services, Spring WebFlux peut être utilisé sur des applications web dont les &lt;strong&gt;IHM&lt;/strong&gt; sont rendues côté serveur (ex : avec Thymeleaf ou Freemarker).&lt;/p&gt;
&lt;p&gt;J’ai récemment migré vers Spring WebFlux la &lt;a href="http://github.com/spring-petclinic/spring-petclinic-kotlin"&gt;version Kotlin et Spring Boot de l’application démo Spring Petclinic&lt;/a&gt;. Dans ce court billet, je voulais vous lister les adaptations mises en œuvre dans le &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin/commit/279b2e7c58906d9a765e7229043c7d563f016b1c"&gt;commit 279b2e7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-webflux"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/12/spring-webflux.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Découvrir Kotlin en migrant une webapp Spring Boot</title><link>https://javaetmoi.com/2017/09/migrez-application-java-spring-boot-vers-kotlin/</link><pubDate>Mon, 25 Sep 2017 16:50:26 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1753</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/Kotlin_logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Lors la dernière conférence Google I/O qui s’est tenue en mai 2017, Google a officialisé le &lt;strong&gt;support de Kotlin sur Android&lt;/strong&gt;. Google n’est pas le seul acteur de l’IT à miser sur ce nouveau langage créé par JetBrains (l’éditeur de l’IDE IntelliJ) et s’exécutant sur la JVM (mais pas que). En effet, dès février 2016, &lt;a href="https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin"&gt;Pivotal proposait de développer des applications &lt;strong&gt;Spring Boot&lt;/strong&gt; avec Kotlin&lt;/a&gt;. En janvier 2017, ils annonçaient que &lt;a href="https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0"&gt;la version 5 du &lt;strong&gt;framework Spring&lt;/strong&gt; proposerait des &lt;strong&gt;fonctionnalités exclusives à Kotlin&lt;/strong&gt;&lt;/a&gt;. Chez Gradle, le langage Kotlin est désormais privilégié au détriment de Groovy.&lt;/p&gt;
&lt;p&gt;Pour découvrir ce nouveau venu dans la galaxie des langages de programmation, je me suis intéressé à migrer vers Kotlin l’application démo Spring Petclinic développée en Java et Spring Boot. Je souhaitais ici partager son code source : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-kotlin"&gt;&lt;strong&gt;spring-petclinic-kotlin&lt;/strong&gt;&lt;/a&gt; et énumérer les différences notables avec sa version Java.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo Kotlin"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2017/09/Kotlin_logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Up-to-date Spring Framework Petclinic presentation</title><link>https://javaetmoi.com/2017/02/spring-framework-petclinic-presentation/</link><pubDate>Fri, 10 Feb 2017 07:40:20 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1672</guid><description>&lt;p&gt;Spring Petclinic is a sample application that has been designed to show how the Spring Framework can be used to build simple but powerful database-­oriented applications.
The « canonical » version of Spring Petclinic is based on Spring Boot and Thymeleaf. But many forks exists: distributed version (microservices) built with Spring Cloud, React, AngularJS. The fork we are talking about is named &lt;strong&gt;Spring&lt;/strong&gt; &lt;strong&gt;Framework&lt;/strong&gt; &lt;strong&gt;Petclinic&lt;/strong&gt;. It maintains a Petclinic version both with a &lt;strong&gt;plain old Spring Framework configuration&lt;/strong&gt; and a &lt;strong&gt;3-layer architecture&lt;/strong&gt; (i.e. presentation &amp;ndash;&amp;gt; service &amp;ndash;&amp;gt; repository).&lt;/p&gt;</description></item><item><title>Découvrez les forks de Spring Petclinic</title><link>https://javaetmoi.com/2016/12/les-forks-de-spring-petclinic/</link><pubDate>Wed, 21 Dec 2016 16:20:08 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1657</guid><description>&lt;p&gt;L’ &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;&lt;strong&gt;application démo Spring Petclinic&lt;/strong&gt;&lt;/a&gt; a été conçue pour montrer comment le framework Spring peut être utilisé pour développer une &lt;strong&gt;application web&lt;/strong&gt; secondée par une base de données relationnelle. En somme, rien de révolutionnaire. Mais c’est ce qui fait tout son intérêt : présenter une &lt;strong&gt;architecture logicielle&lt;/strong&gt; respectant &lt;strong&gt;l’état de l’art&lt;/strong&gt; d’une application conçue avec &lt;strong&gt;Spring&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Avec plus de 2000 forks sur GitHub, la communauté a créé de nombreux forks de Spring Petclinic : &lt;strong&gt;Angular&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;Spring Cloud&lt;/strong&gt; … Afin de fédérer cet engouement, l’ &lt;a href="https://github.com/spring-petclinic"&gt;&lt;strong&gt;organisation GitHub Spring Petclinic&lt;/strong&gt;&lt;/a&gt; a été créé sur GitHub en novembre 2016. La version de référence de Spring Petclinic reste sur &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;https://github.com/spring-projects/spring-petclinic&lt;/a&gt;. Les branches et les forks ont basculé sur &lt;a href="https://github.com/spring-petclinic"&gt;https://github.com/spring-petclinic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce billet a pour objectif de vous présenter cette récente initiative puis de vous présenter les &lt;strong&gt;différents forks&lt;/strong&gt; d’ores et déjà disponible dans l’organisation Spring Petclinic. Mais avant cela, remontons le temps.&lt;/p&gt;</description></item><item><title>Introduction à Spring Boot</title><link>https://javaetmoi.com/2016/10/introduction-a-spring-boot/</link><pubDate>Wed, 05 Oct 2016 16:06:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1644</guid><description>&lt;p&gt;Dans &lt;a href="http://javaetmoi.com/2016/08/migrer-vers-spring-boot/"&gt;mon précédent article sur Spring Boot&lt;/a&gt;, je vous détaillais le chemin de migration de l’application démo &lt;a href="https://github.com/spring-projects/spring-petclinic"&gt;Spring Petclinic&lt;/a&gt; vers Spring Boot. Intéressons-nous aujourd’hui aux fondamentaux : &lt;strong&gt;qu’est-ce qu’est Spring Boot ? Et comment fonctionne-t-il ?&lt;/strong&gt; Vous trouverez des éléments de réponse dans la présentation suivante. J’y décris les grands principes de Spring Boot. Puis j’essaie de démystifier le &lt;strong&gt;fonctionnement de l’auto-configuration&lt;/strong&gt;. Enfin, je montre comment Spring Boot permet de simplifier encore davantage vos &lt;strong&gt;tests&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;[slideshare id=66730766&amp;amp;doc=2016-10-04-introductionaspringboot-161004173204]&lt;/p&gt;</description></item><item><title>Migrer vers Spring Boot</title><link>https://javaetmoi.com/2016/08/migrer-vers-spring-boot/</link><pubDate>Mon, 29 Aug 2016 16:05:29 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1623</guid><description>&lt;p&gt;Cela fait un an que je contribue activement à la maintenance de l’application &lt;strong&gt;Spring Petclinic&lt;/strong&gt;. Développée initialement par les créateurs du framework Spring, Juergen Hoeller et Rob Harrop, cette application démo a évolué au fur et à mesure des montées de version du framework. Elle est passée d’une approche full XML, à une approche mixte annotations + XML. Une branche est également disponible pour la configuration Java.
Récemment, nous avons mis à disposition une branche basée sur &lt;strong&gt;Spring Boot 1.4.0&lt;/strong&gt;. L’objectif de ce billet est de vous expliquer quels ont été les impacts d’une telle migration.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="screenshot-petclinic"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/07/screenshot-petclinic.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Spring Core 4.2 Certification Mock Exam</title><link>https://javaetmoi.com/2016/01/spring-core-4-2-certification-mock-exam/</link><pubDate>Mon, 18 Jan 2016 07:05:32 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1508</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Four years ago, I’ve published a first &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;mock exam for the Spring Core 3.0 Certification&lt;/a&gt;. Encouraged by Michael and Alan, I’ve updated this &lt;strong&gt;free&lt;/strong&gt; &lt;strong&gt;mock exam&lt;/strong&gt; for the &lt;a href="http://pivotal.io/academy#certification"&gt;Spring Professional certification based on the Spring Core 4.2 course&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href="wp-content/uploads/2016/01/Core-Spring-4.2-Certification-Study-Guide.pdf"&gt;Core Spring 4.2 Certification Study Guide&lt;/a&gt;, 3 new topics have been added to the &lt;strong&gt;Spring Core 4.2 mock exam&lt;/strong&gt;: &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;Microservices&lt;/strong&gt; and &lt;strong&gt;Spring Cloud&lt;/strong&gt;. They replace older topics: JMX, JMS and Remoting.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Les dessous du Framework Spring</title><link>https://javaetmoi.com/2015/12/les-dessous-du-framework-spring/</link><pubDate>Mon, 07 Dec 2015 17:50:46 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1493</guid><description>&lt;p&gt;Chaque jour, de nombreux développeurs utilisent le &lt;strong&gt;framework Spring&lt;/strong&gt; pour &lt;strong&gt;l’injection de dépendances&lt;/strong&gt; et la &lt;strong&gt;gestion des transactions&lt;/strong&gt;. Majeures, ces 2 fonctionnalités ne nécessitent pas un gros effort d’apprentissage. Pour autant, leurs mises en œuvre par le framework est complexe. Par curiosité intellectuelle, mais également afin d’éviter certains pièges et de profiter pleinement des capacités de Spring, il est intéressant de comprendre les &lt;strong&gt;mécanismes internes du framework&lt;/strong&gt; qu’on utilise au quotidien : &lt;strong&gt;cycle de vie&lt;/strong&gt; d’un bean, &lt;strong&gt;proxy&lt;/strong&gt;, &lt;strong&gt;intercepteur&lt;/strong&gt;, &lt;strong&gt;post-processeur&lt;/strong&gt;, &lt;strong&gt;fabrique&lt;/strong&gt; de beans, &lt;strong&gt;hiérarchie de contextes&lt;/strong&gt;, &lt;strong&gt;portée&lt;/strong&gt; …
Les slides de cette présentation ont pour objectif de vous les introduire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="//fr.slideshare.net/AntoineRey/les-dessous-du-framework-spring" title="Les dessous du framework spring"&gt;Les dessous du framework spring&lt;/a&gt;&lt;/strong&gt; par &lt;strong&gt;&lt;a href="//www.slideshare.net/AntoineRey"&gt;Antoine Rey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Etude de cas Spring Integration</title><link>https://javaetmoi.com/2015/03/etude-de-cas-spring-integration-elasticsearch/</link><pubDate>Wed, 11 Mar 2015 06:30:58 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1310</guid><description>&lt;p&gt;Vous avez déjà entendu parler d’ &lt;strong&gt;Apache Camel&lt;/strong&gt; ?
Les Design Pattern n’ont plus de secrets pour vous ?
L’Event Driven Architecture vous attire ?
Les &lt;strong&gt;Enterprise Integration Pattern&lt;/strong&gt; vous interpellent ?
Vos applications reposent sur TCP, JMS, FTP, SFTP, les fichiers, les mails, XML, les web services SOAP, REST, RSS, JPA, JDBC ou même Twitter ?&lt;/p&gt;
&lt;p&gt;N’attendez plus : venez découvrir l’utilisation des patterns comme le &lt;strong&gt;Channel&lt;/strong&gt; &lt;strong&gt;Adapter&lt;/strong&gt;, le &lt;strong&gt;Router&lt;/strong&gt; ou l’ &lt;strong&gt;Aggregator&lt;/strong&gt; au travers d’un &lt;strong&gt;workshop sur Spring Integration&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Etudes de cas Spring Batch</title><link>https://javaetmoi.com/2015/02/worskshop-etudes-de-cas-spring-batch/</link><pubDate>Mon, 02 Feb 2015 07:16:08 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1304</guid><description>&lt;p&gt;Pour créer vos IHM web en Java, vous n’avez que l’embarras du choix : Vaadin, JSF, GWT, Spring MVC, Tapestry …&lt;/p&gt;
&lt;p&gt;Pour accéder aux données, à chacun ses préférences : Hibernate, JPA 2, iBatis, Spring JDBC, Spring Data …&lt;/p&gt;
&lt;p&gt;En matière de web services, il n’y a qu’à choisir : CXF, JAX-WS, JAX-RS, Spring WS, Restlet …&lt;/p&gt;
&lt;p&gt;Mais pour écrire vos traitements par lot ? java.io ? Soyons fou : commons-io. Pas très sexy …
la JSR-352 Java Batch de JEE 7 ? Optez pour l’original.&lt;/p&gt;
&lt;p&gt;Alors franchissez le pas et venez découvrir Spring Batch au cours d’un workshop basé sur un cas d’utilisation concret.&lt;/p&gt;</description></item><item><title>Tests et techniques avancées du conteneur Spring</title><link>https://javaetmoi.com/2014/12/tests-et-techniques-avancees-conteneur-spring/</link><pubDate>Wed, 17 Dec 2014 17:09:13 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1268</guid><description>&lt;p&gt;L&amp;rsquo;écosystème des technologies supportées par Spring vous est familier.
L&amp;rsquo;inversion de contrôle et l&amp;rsquo;injection de dépendances n&amp;rsquo;ont plus de secret pour vous.
Les supports de JDBC, de JPA et d&amp;rsquo;Hibernate sont pour vous une réalité.
Vous êtes conquis par la magie de Spring Data JPA.
Vous avez testé QueryDSL.
Alors n&amp;rsquo;attendez plus !!&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;secrets du conteneur&lt;/strong&gt; Spring vous attendent pour ce 3ième workshop sur le framework Spring : module &lt;strong&gt;spring-test&lt;/strong&gt;, &lt;strong&gt;injection de beans de portées différentes&lt;/strong&gt;, &lt;strong&gt;support&lt;/strong&gt; des &lt;strong&gt;JSR 250&lt;/strong&gt; et &lt;strong&gt;330&lt;/strong&gt;, &lt;strong&gt;post-processeurs de beans&lt;/strong&gt;, fichiers de &lt;strong&gt;configuration&lt;/strong&gt; et abstraction de l’accès aux ressources.&lt;/p&gt;
&lt;p&gt;Conçu en décembre 2011, et faisant suite aux 2 billets précédents, le support de présentation de ce workshop reste d’actualités avec Spring 4.x. Seule la syntaxe XML pourrait de nos jours être réécrites en Java.&lt;/p&gt;</description></item><item><title>Désendettement du projet ehcache-spring-annotations</title><link>https://javaetmoi.com/2014/12/migration-projet-ehcache-spring-annotations/</link><pubDate>Mon, 01 Dec 2014 05:53:51 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1273</guid><description>&lt;p&gt;EhCache est sans nul doute le framework open source de gestion de cache applicatif le plus populaire parmi les développeurs Java. Polyvalent, &lt;strong&gt;EhCache&lt;/strong&gt; peut être mis en œuvre dans les différentes couches d’une application web :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="wp-content/uploads/2014/05/logo-spring-highres.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Persistance : utilisé comme cache de niveau 2 de JPA / Hibernate pour stocker des entités et le résultat des requêtes en base.&lt;/li&gt;
&lt;li&gt;Service métier : mise en cache du résultat d’un service métier ou d’un appel de web service&lt;/li&gt;
&lt;li&gt;Présentation : cache de pages ou de fragments de page HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Habitués à gérer la sécurité et les transactions de manière déclarative à l’aide d’annotations, le projet open source &lt;a href="https://code.google.com/p/ehcache-spring-annotations/"&gt;ehcache-spring-annotations&lt;/a&gt; a fait le bonheur des développeurs Spring en 2010 en introduisant l’ &lt;strong&gt;annotation @Cacheable&lt;/strong&gt;
Hébergé sur Google Code, ce projet n’est aujourd’hui plus maintenu. Il ne supporte pas Spring 4.x. Rattrapant son retard, la version 3.1 du framework Spring a été enrichi de sa propre annotation @Cacheable. Comme à son habitude, Spring permet de s’abstraire de la solution de cache sous-jacente (ex : ConcurrentMap, EhCache, Guava …) en proposant une API générique. Les débuts de cette API ont été difficiles (cf. SPR-10237 à laquelle j’ai participé). Aujourd’hui mature, implémentant la JSR-107 JCache, il n’y a aucune raison pour ne pas migrer dessus.
Relativement court &lt;strong&gt;, ce billet explique pas à pas comment migrer de ehcache-spring-annotations vers le support de cache du framework Spring&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Persistance de données avec Spring</title><link>https://javaetmoi.com/2014/11/persistance-spring-jdbc-hibernate-jpa/</link><pubDate>Fri, 21 Nov 2014 06:14:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1247</guid><description>&lt;p&gt;Dans le &lt;a href="http://javaetmoi.com/2014/11/workshop-spring-1-offre-spring-et-bases/" title="L’offre Spring et les bases"&gt;1er workshop&lt;/a&gt;, je vous présentais l&amp;rsquo;écosystème de Spring et les bases du conteneur léger.
Ce second workshop se focalise sur une couche centrale de la majorité des applications d&amp;rsquo;entreprise : &lt;strong&gt;la persistance de données&lt;/strong&gt;. Vous verrez que Spring facilite la &lt;strong&gt;gestion des exceptions&lt;/strong&gt; et des &lt;strong&gt;transactions&lt;/strong&gt;. En supprimant le boilerplate code, Spring facilite également l&amp;rsquo;accès aux différentes technologies de persistance : que ce soit &lt;strong&gt;JDBC&lt;/strong&gt;, &lt;strong&gt;Hibernate&lt;/strong&gt; ou bien encore &lt;strong&gt;JPA&lt;/strong&gt;. Enfin, nous verrons comment les projets &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;QueryDSL&lt;/strong&gt; simplifient encore davantage l&amp;rsquo;écriture de la couche d&amp;rsquo;accès aux données.&lt;/p&gt;
&lt;p&gt;Voici le support de présentation du workshop sur Spring que j’ai animé en décembre 2011 au sein de ma société et que j’ai réactualisé avant sa diffusion sur Slideshare :&lt;/p&gt;</description></item><item><title>L'offre Spring et les bases</title><link>https://javaetmoi.com/2014/11/workshop-spring-1-offre-spring-et-bases/</link><pubDate>Sat, 01 Nov 2014 16:09:11 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1235</guid><description>&lt;p&gt;Rejoignez les millions de développeurs Spring.
De par sa forte pénétration dans les entreprises, tout développeur Java /JEE a ou aura à travailler sur une application s’appuyant sur Spring. Or Spring dépasse le cadre du simple framework open source.
Cette série de 5 workshops a pour objectif de faire un tour d’horizon de l’écosystème des technologies supportées par Spring avant de se focaliser plus spécifiquement sur certaines d’entre elles.
Retours d’expérience, bonnes pratiques, techniques avancées seront de partie.&lt;/p&gt;
&lt;p&gt;Propulsée dans Java EE 6 avec CDI et plus récemment au sein de JavaScript avec Google Gin, l’injection de dépendance sera au cœur du premier workshop.
Voici le support de présentation du workshop sur Spring que j&amp;rsquo;ai animé en novembre 2011 au sein de ma SSII et que j&amp;rsquo;ai réactualisé avant sa diffusion sur Slideshare.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="//fr.slideshare.net/AntoineRey/workshop-spring-session-1-loffre-spring-et-les-bases" title="Workshop Spring - Session 1 - L&amp;#39;offre Spring et les bases"&gt;Workshop Spring - Session 1 - L&amp;rsquo;offre Spring et les bases&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href="//www.slideshare.net/AntoineRey"&gt;Antoine Rey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Démystifier l’annotation @SessionAttributes de Spring MVC</title><link>https://javaetmoi.com/2014/10/annotation-sessionattributes-modelattribute-spring-mvc/</link><pubDate>Tue, 14 Oct 2014 04:53:33 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1216</guid><description>&lt;a href="wp-content/uploads/2014/05/logo-spring-highres.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Le développement d’applications web requière une vigilance toute particulière quant à l’utilisation de la &lt;strong&gt;session web&lt;/strong&gt;. Spring MVC offre les mécanismes permettant aux développeurs de ne plus manipuler directement l’objet &lt;strong&gt;&lt;em&gt;HttpSession&lt;/em&gt;&lt;/strong&gt; mis à disposition par le conteneur web. Les 2 annotations &lt;strong&gt;&lt;em&gt;@Scope(&amp;ldquo;session&amp;rdquo;)&lt;/em&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; en font parties. Dans ce billet, je vous expliquerai &lt;strong&gt;le fonctionnement de l’annotation &lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; qu’il est essentiel de maitriser avant d’utiliser. Nous verrons qu’elle fonctionne de pair avec l’annotation &lt;strong&gt;&lt;em&gt;@ModelAttribute&lt;/em&gt;&lt;/strong&gt; et qu’elle permet de simuler une &lt;strong&gt;portée conversation&lt;/strong&gt;. Nous commencerons cet article par rappeler ce qu’est &lt;strong&gt;un modèle&lt;/strong&gt; et nous le terminerons en &lt;strong&gt;testant&lt;/strong&gt; &lt;strong&gt;unitairement&lt;/strong&gt; du code qui utilise &lt;em&gt;@SessionAttributes&lt;/em&gt;.</description></item><item><title>Validation HTML 5 avec Spring MVC et Bean Validation</title><link>https://javaetmoi.com/2014/09/validation-html-5-avec-spring-mvc-et-bean-validation/</link><pubDate>Tue, 16 Sep 2014 06:40:53 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1199</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo HTML 5"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cet article explique comment &lt;strong&gt;étendre Spring MVC pour générer le code HTML 5&lt;/strong&gt; &lt;strong&gt;des champs de saisie&lt;/strong&gt; (input fields) à partir des &lt;strong&gt;annotations Bean Validation&lt;/strong&gt; (JSR 330) apposées sur des Entités ou de simples DTO.&lt;/p&gt;
&lt;p&gt;Dans une application web &lt;strong&gt;, valider les écrans de saisie côté client&lt;/strong&gt; permet de donner un retour rapide à l’utilisateur. Avant HTML 5, le développeur web était bien démuni pour implémenter ces contrôles de surface sur le Navigateur. Certes, HTML 4 permettait de spécifier la taille max des champs de saisie (balise &lt;em&gt;maxLength&lt;/em&gt;) et leur caractère obligatoire ou non (balise &lt;em&gt;required&lt;/em&gt;). Les autres contrôles effectués côté serveur étaient alors bien souvent recodés en JavaScript à l’aide de jQuery, de CSS et de quelques plugins.
Aujourd’hui, HTML 5 se démocratise et le code JavaScript de validation devrait bientôt s’alléger drastiquement. En effet, cette spécification permet de standardiser la validation des champs de saisie côté client. Le développeur a désormais la possibilité de spécifier le type de champs (ex : nombre, date, URL …), des valeurs min et max ou bien encore un pattern de validation à l’aide d’une expression régulière.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo HTML 5"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/09/2014-09-input-spring-mvc-en-html5-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Configurez Spring en Java</title><link>https://javaetmoi.com/2014/06/spring-framework-java-configuration/</link><pubDate>Mon, 16 Jun 2014 05:07:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1122</guid><description>Dans ce billet, nous verrons comment &lt;strong&gt;configurer en Java&lt;/strong&gt; le &lt;strong&gt;contexte Spring&lt;/strong&gt; d’une application basée sur &lt;strong&gt;Spring MVC&lt;/strong&gt;, &lt;strong&gt;Spring Security&lt;/strong&gt;, &lt;strong&gt;Spring Data JPA&lt;/strong&gt; et &lt;strong&gt;Hibernate&lt;/strong&gt;, et cela sans utiliser la moindre ligne de XML.&lt;br&gt;Personnellement, je n’ai rien contre la &lt;strong&gt;syntaxe XML&lt;/strong&gt; à laquelle j’étais habitué. D’autant la &lt;strong&gt;verbosité&lt;/strong&gt; de la configuration avait considérablement diminué grâce à l’introduction des &lt;strong&gt;namespaces XML&lt;/strong&gt; et des &lt;strong&gt;annotations&lt;/strong&gt;. Avant d’utiliser la syntaxe Java sur une application d’entreprise, j’étais même sceptique quant aux gains qu’elle pouvait apporter. Aujourd’hui, je comprends mieux son intérêt et pourquoi les projets du portfolio Spring tels &lt;a href="http://spring.io/blog/2014/04/30/spring-integration-4-0-released"&gt;Spring Integration 4.0&lt;/a&gt;, &lt;a href="#ZgotmplZ"&gt;Spring Web Service 2.2&lt;/a&gt; ou bien &lt;a href="http://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security"&gt;Spring Security 3.2&lt;/a&gt; proposent dans leur dernière version un niveau de configuration Java iso-fonctionnel avec leur équivalent XML. Sans compter que le support de la configuration Java leur ouvre la porte d’une intégration plus poussée à &lt;a href="http://projects.spring.io/spring-boot/"&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;/a&gt;, le nouveau fer de lance de Pivotal.&lt;br&gt;</description></item><item><title>Support du VFS 2 de JBoss 5 dans Spring 4</title><link>https://javaetmoi.com/2014/04/support-vfs2-jboss5-spring4/</link><pubDate>Tue, 01 Apr 2014 04:50:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1032</guid><description>&lt;p&gt;Ce billet solutionne un problème rencontré lors de la &lt;strong&gt;montée de version du famework Spring&lt;/strong&gt; de la version 3.2 à la &lt;strong&gt;version&lt;/strong&gt; &lt;strong&gt;4.0&lt;/strong&gt;. En effet, le déploiement d’une application sous &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; échouait dès l’initialisation du contexte Spring. Plus précisément, une exception était levée lorsque Spring scanne le classpath à la recherche de beans Spring annotés par les annotations @Repository, @Service, @Controller …&lt;br&gt;Comme le montre la pile d’appel complète ci-dessous, l’exception &lt;strong&gt;java.lang.ClassNotFoundException: org.jboss.vfs.VFS&lt;/strong&gt; est encapsulée dans l’exception &lt;strong&gt;java.lang.IllegalStateException: Could not detect JBoss VFS infrastructure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce problème ne m’était initialement pas apparu lors des développements sous Eclipse avec le plugin JBoss Tools pour WTP : Spring n’a aucun mai à trouver les beans d’un WAR ou d’un EAR explosé. Cette erreur s’est manifestée lors du déploiement manuel de l’EAR dans le répertoire deploy de JBoss puis du démarrage du serveur par la commande run.bat.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-framework"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/logo-spring-framework.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Architecture d’un middle d’indexation</title><link>https://javaetmoi.com/2013/02/architecture-middle-indexation-elasticsearch/</link><pubDate>Tue, 26 Feb 2013 10:35:42 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=604</guid><description>Dans &lt;a href="http://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/" title="Parallélisation de traitements batchs"&gt;un précédent billet&lt;/a&gt;, je vous ai présenté les solutions mises en œuvre sur un projet pour paralléliser un batch d’indexation alimentant un moteur de recherche d’entreprise. Utilisée pour initialiser l’index de recherche puis le resynchroniser quotidiennement, la technique d’intégration par batch ne permet cependant pas d’indexer les données au fil de l’eau. Ce billet aborde précisément cet aspect. En effet, le fil de l’eau ou le quasi temps réel fut dès le départ une exigence forte du métier. Recherches instantanées et auto-complétion révolutionnent le traditionnel formulaire de recherche mettant plusieurs secondes à renvoyer les résultats. Mais au prix de faire des recherches sur des données pouvant dater de J-1 ? Ce n’était pas acceptable ! Un middle d’indexation fut la réponse apportée.</description></item><item><title>Parallélisation de traitements batchs</title><link>https://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/</link><pubDate>Sat, 01 Dec 2012 17:54:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=368</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Récemment, j’ai participé au développement d’un batch capable d’indexer dans le moteur de recherche &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt; des données provenant d’une &lt;strong&gt;base de données&lt;/strong&gt; tierce. Développé en Java, ce batch s’appuie sur &lt;a href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;, le plus célèbre framework de traitements par lot de l’écosystème Java&lt;br&gt;Plus précisément, ce batch est décomposé en 2 jobs Spring Batch, très proches l’un de l’autre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le premier est capable d’initialiser à partir de zéro le moteur de recherche&lt;/li&gt;
&lt;li&gt;et le second traite uniquement les mouvements quotidiens de données.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="problématique"&gt;Problématique&lt;/h2&gt;
&lt;p&gt;Au cours du traitement batch, l’exécution de la requête par Oracle pour préparer son &lt;strong&gt;curseur&lt;/strong&gt; a été identifiée comme l’opération la plus couteuse, loin devant la lecture des enregistrements en &lt;strong&gt;streaming&lt;/strong&gt; à travers le réseau, leur traitement chargé de construire les documents Lucene à indexer ou leur &lt;strong&gt;écriture en mode&lt;/strong&gt; bulk dans ElasticSearch. A titre d’exemple, sur des volumétries de production, la préparation côté serveur Oracle d’une requête SQL ramenant 10 millions d’enregistrement peut mettre jusqu’à 1h30.&lt;/p&gt;
&lt;p&gt;Avec pour objectif que le batch passe &lt;strong&gt;sous le seuil de 2h&lt;/strong&gt; à moindre coût, 2 axes d’optimisations ont été étudiés : diminuer le temps d’exécution par Oracle et diminuer le temps de traitement.&lt;/p&gt;
&lt;h2 id="solutions-étudiées"&gt;Solutions étudiées&lt;/h2&gt;
&lt;p&gt;Les optimisations d’un DBA consistant à utiliser des &lt;strong&gt;tables temporaires&lt;/strong&gt; et des &lt;strong&gt;procédures stockées&lt;/strong&gt; n’ont pas été concluantes : trop peu de gains (10 à 20%) pour une réécriture partielle de notre batch, et avec le risque d’engendrer des régressions.&lt;/p&gt;
&lt;p&gt;Après mesures et calculs, l’utilisation de la &lt;strong&gt;pagination&lt;/strong&gt; sur des plages de 100, de 1 000 ou même de 10 000 enregistrements a également été écartée. Dans notre contexte, cela aurait dégradé les performances. Le choix de rester sur l’utilisation d’un &lt;strong&gt;curseur JDBC&lt;/strong&gt; a été maintenu.&lt;br&gt;A cette occasion, nous avons remarqué que les temps de mise en place d’un curseur Oracle pour préparer 1 millions ou 10 millions d’enregistrements étaient du même ordre de grandeur.&lt;/p&gt;
&lt;p&gt;Utilisant déjà l’une des techniques proposées par Spring Batch pour paralléliser notre traitement batch, pourquoi ne pas refaire appel à ses loyaux services ?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Modèle physique de données des tables MASTERPIECE, MUSIC_ALBUM et MOVIE"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/11/Parall%C3%A9lisationTraitementsBatch_MPD.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Enterprise Spring Integration Certification Mock Exam</title><link>https://javaetmoi.com/2012/10/enterprise-spring-integration-certification-mock-exam/</link><pubDate>Sat, 27 Oct 2012 17:29:57 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=324</guid><description>&lt;p&gt;Last month, I passed the &lt;a href="http://mylearn.vmware.com/mgrReg/plan.cfm?plan=31113&amp;amp;ui=www_cert"&gt;Enterprise Integration with Spring&lt;/a&gt; exam (EIwS 1.x) with a score of 90%. This test is also known as Certified Enterprise Integration Specialist exam. Before passing this exam, you have to attend &lt;a href="http://mylearn.vmware.com/mgrreg/courses.cfm?ui=www_edu&amp;amp;a=one&amp;amp;id_subject=17833"&gt;Enterprise Integration with Spring training&lt;/a&gt; from SpringSource or a Certified Partner.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;In my last blog entry, I have published a &lt;a href="http://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/"&gt;french study guide / notes&lt;/a&gt; to the exam. Since, I received a few emails asking me some materials in English.&lt;/p&gt;
&lt;p&gt;Opposed to the Spring Core Certification, I didn’t find any mock exams for the . So I decided to create a mock exam like I did in my &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;Core Spring 3.0 Certification Mock Exam blog entry&lt;/a&gt;. The questions are close to the real Enterprise Integration with Spring exam and I hope will help you in practicing for the test or to test your Spring Integration proficiently. I have tried to keep my exam accurate, based on my real exam-experience.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Enterprise Spring Integration Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Certified Spring Enterprise Integration Specialist Study Notes</title><link>https://javaetmoi.com/2012/09/certified-spring-enterprise-integration-specialist-study-notes/</link><pubDate>Sat, 29 Sep 2012 11:18:22 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=230</guid><description>&lt;p&gt;En l’espace de 8 mois, me voici doté d’une deuxième certification Spring. Après la certification Spring Core dont je vous ai fait écho dans mon tout &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/" title="Core Spring 3.0 Certification Mock Exam"&gt;premier billet&lt;/a&gt;, j’ai eu l’opportunité de préparer la certification Spring Integration Specialist.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt=""
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Comme à l’accoutumée avec les certifications Spring, la &lt;a href="http://www.zenika.com/formation_enterprise_integration_avec_spring.html" title="Formation Enterprise Integration avec Spring"&gt;formation officielle Spring Enterprise Integration&lt;/a&gt; est pré-requise. Elaborée par SpringSource et dispensée par Zenika, cette formation couvre de nombreux sujets basés sur Spring Framework 3 et différents projets du Portfolio Spring :&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Certified Spring Enterprise Integration Specialist Study Notes"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/09/CertifiedSpring_EnterpriseIntegrationSpecialist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Spring Batch s'auto-nettoie</title><link>https://javaetmoi.com/2012/06/sprint-batch-sauto-nettoie/</link><pubDate>Tue, 26 Jun 2012 18:49:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=187</guid><description>&lt;p&gt;Lorsque vous mettez en œuvre &lt;strong&gt;&lt;a href="http://static.springsource.org/spring-batch/" title="Page d&amp;#39;accueil du projet Spring Batch"&gt;Spring Batch&lt;/a&gt;&lt;/strong&gt; pour réaliser des traitements par lots, vous avez le choix d’utiliser &lt;strong&gt;une implémentation de &lt;em&gt;JobRepository&lt;/em&gt;&lt;/strong&gt; soit &lt;strong&gt;en mémoire&lt;/strong&gt; soit &lt;strong&gt;persistante&lt;/strong&gt;. L’avantage de cette dernière est triple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Conserver un &lt;strong&gt;historique des différentes exécutions&lt;/strong&gt; de vos instances de jobs.&lt;/li&gt;
&lt;li&gt;Pouvoir &lt;strong&gt;suivre en temps réel le déroulement de votre batch&lt;/strong&gt; via, par exemple, l’excellent &lt;a href="http://static.springsource.org/spring-batch-admin/" title="Page d&amp;#39;accueil du projet Spring Batch Admin"&gt;Spring Batch Admin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Avoir la possibilité de &lt;strong&gt;reprendre un batch&lt;/strong&gt; là où il s’était arrêté en erreur.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La contrepartie d’utiliser un JobRepository persistant est de devoir faire reposer le batch sur une &lt;strong&gt;base de données&lt;/strong&gt; relationnelles. Le schéma sur lequel s’appuie Spring Bath est composé de &lt;strong&gt;6 tables&lt;/strong&gt;. Leur MPD est disponible dans l’ &lt;a href="http://static.springsource.org/spring-batch/reference/html/metaDataSchema.html" title="Appendix B. Spring Batch Meta-Data Schema"&gt;annexe B. Meta-Data Schema&lt;/a&gt; du &lt;a href="http://static.springsource.org/spring-batch/reference/html/" title="Manuel de référence de Spring Batch au format HTML"&gt;manuel de référence de Spring Batch&lt;/a&gt;. SpringSource faisant bien les choses, les scripts DDL de différentes solutions du marché (ex : MySQL, Oracle, DB2, SQL Server, Postgres, H2 …) sont disponibles dans le package org.springframework.batch.core du JAR spring-batch-core-xxx.jar&lt;br&gt;Qui dit base de données, dit &lt;strong&gt;dimensionnement&lt;/strong&gt; de cette dernière. L’ &lt;strong&gt;espace disque requis&lt;/strong&gt; est alors &lt;strong&gt;fonction&lt;/strong&gt; du &lt;strong&gt;nombre d’exécutions&lt;/strong&gt; estimé, de la &lt;strong&gt;nature des informations contextuelles persistées&lt;/strong&gt; et de la &lt;strong&gt;durée de rétention&lt;/strong&gt; des données. Cette démarche prend tout son sens lorsqu’une instance de base de données est dédiée au schéma de Spring Batch. En faisant quelques hypothèses (ex : sur le taux d’échec) et en mesurant le volume occupé sur plusieurs exécutions des batchs, il est possible de prévoir assez finement l’espace occupé par les données.&lt;/p&gt;
&lt;p&gt;A moins de disposer de ressources infinies ou de n’avoir qu’un seul batch annuel, il est fréquent de fixer une durée de rétention de l’historique. Première option : demander à l’équipe d’exploitation de régulièrement lancer un script SQL de purge. Deuxième option : &lt;strong&gt;utiliser Spring Batch pour purger ses propres données&lt;/strong&gt; !!&lt;/p&gt;</description></item><item><title>Core Spring 3.0 Certification Mock Exam</title><link>https://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/</link><pubDate>Sun, 26 Feb 2012 16:22:40 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=18</guid><description>&lt;p&gt;Le &lt;strong&gt;framework Spring&lt;/strong&gt; est à l’honneur dans le premier article de ce tout jeune blog. En effet, début février j’ai eu l’opportunité de passer la &lt;strong&gt;&lt;a href="http://www.springsource.com/training/certification/springprofessional" title="SpringSource Certified Spring Professionnal"&gt;Certification Core Spring 3.0&lt;/a&gt;&lt;/strong&gt;. Et par ce billet, je tenais faire part de mon &lt;strong&gt;retour d’expérience&lt;/strong&gt; mais surtout vous offrir librement un &lt;strong&gt;examen blanc&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme pré-requis pour passer la certification, sachez tout d’abord qu’il est nécessaire de suivre la &lt;strong&gt;formation officielle de 4 jours&lt;/strong&gt; estampillée SpringSource. En France, elle est exclusivement assurée par le cabinet d’architecture Zenika. Mon formateur fut l’un de co-auteurs du très bon livre Spring par la Pratique.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Core Spring 3.0 Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/02/CertitfiedSpring_Professional.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>