The Coder's Breakfast - Mot-clé - spring2022-11-22T14:44:11+01:00Olivier Croisierurn:md5:7bccc57fa40daaa0bbb47c16f3d66529DotclearNotes de révision Springurn:md5:e60b815379ba9978505a846fb12fe4342020-09-01T22:03:00+02:002020-09-01T22:03:00+02:00Olivier CroisierArticlesspring <p>J'ai retrouvé dans mes archives mes notes de révision pour la certification Spring Developer, et j'ai pensé que cela pourrait vous intéresser. Je vous mets le document en pièce jointe.
Certes, il s'agissait de Spring 2.5 à l'époque, mais tous les concepts sont encore valides, en particulier si vous intervenez sur un projet Spring "brut" (non-Boot).... <a href="http://thecodersbreakfast.net/index.php?post/2020/09/01/Notes-de-revision-certification-Spring"><em>Lire</em> Notes de révision Spring</a></p>http://thecodersbreakfast.net/index.php?post/2020/09/01/Notes-de-revision-certification-Spring#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/368Spring MVC : Développer un convertisseur personnaliséurn:md5:f16d98f121f14de190f67cb9ba8252e12017-02-28T07:00:00+01:002017-03-07T22:27:40+01:00Olivier CroisierArticlesjavaspring<p>La modélisation d'une API REST permettant de gérer une ressource naturellement arborescente pose un problème technique intéressant.</p>
<p>Pour l'exemple, imaginons une API permettant de lire les métadonnées (taille, date d'accès...) d'un fichier sur disque, identifié par son chemin.<br />
Selon la logique RESTful, l'URI associée au fichier <code>foo/bar/baz.txt</code> doit être <code>http://<server:port>/file/foo/bar/baz.txt</code>, et le <em>endpoint</em> Spring MVC associé mappé comme ceci :</p>
<pre class="brush: java">@GetMapping("/file/{path}")
public HttpEntity<FileInfo> fileInfo(@PathVariable("path") String path) {
return filesystemDao.getFileInfo(path);
}</pre>
<p>Problème : Spring MVC ne sait pas capturer les fragments d'URL (@PathVariable) contenant des "slash" <a href="https://jira.spring.io/browse/SPR-12546" title="SPR-12546"></a>, même encodés en <code>%2F</code>.</p>
<p>En réfléchissant plus avant, on s'aperçoit que les "slash" ne sont pas les seuls caractères pouvant poser problème : les noms des répertoire et fichiers sont autorisés à contenir des caractères incompatibles avec les URLs. Il nous faut donc encoder tout le chemin, mais, à cause du bug indiqué plus haut, un simple "urlencode" ne suffit pas.<br />
We need a bigger boat.</p> <p>Encode all the things !
Un encodage qui élimine les caractères spéciaux et les slashes... et pourquoi pas Base64 ?
Le très problématique chemin foo/bar/baz.txt devient alors http://<server:port>/file/L2Zvby9iYXIvYmF6LnR4dA - plus de problèmes !
Côté client, Javascript fournit la méthode btoa, employée ci-dessous dans un service Angular... <a href="http://thecodersbreakfast.net/index.php?post/spring-mvc-developper-convertisseur-personnalise"><em>Lire</em> Spring MVC : Développer un convertisseur personnalisé</a></p>http://thecodersbreakfast.net/index.php?post/spring-mvc-developper-convertisseur-personnalise#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/363Implémenter le pattern Session Object avec Spring MVCurn:md5:ec3737ae512d2323d9c0fe2904b817a12013-09-12T07:00:00+02:002013-09-12T07:00:00+02:00Olivier CroisierArticlesjavaspring<p>HTTP est un protocole déconnecté : un client se connecte à un serveur, lui transmet une requête, attend une réponse, et se déconnecte. Bonjour, au revoir, et on recommence à zéro.</p>
<p>Pour servir des documents sur un réseau, c'est parfait ; mais pour interagir avec une application web professionnelle, c'est un peu limité. L'utilisateur apprécie qu'on se rappelle de lui tout au long de sa session de travail, qui peut nécessiter de nombreux cycles requête/réponse. <br />
Pour conserver ce contexte applicatif entre les requêtes, le serveur propose donc la notion de Session. Chaque utilisateur se voit ainsi attribuer un petit coffre-fort personnel, dans lequel les données qui le concernent sont stockées entre les requêtes.</p> <p>Le problème
En Java, la session est représentée par la classe HttpSession, qui s'utilise à la manière d'une Map : chaque valeur est associée à une clé (souvent une String), qui permet de récupérer ladite valeur par la suite. HttpSession possède donc la simplicité d'utilisation d'une Map, mais également ses inconvénients.
Tout d'abord, il est... <a href="http://thecodersbreakfast.net/index.php?post/2013/09/12/Impl%C3%A9menter-le-pattern-Session-Object-avec-Spring-MVC"><em>Lire</em> Implémenter le pattern Session Object avec Spring MVC</a></p>http://thecodersbreakfast.net/index.php?post/2013/09/12/Impl%C3%A9menter-le-pattern-Session-Object-avec-Spring-MVC#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/340Développer une application REST avec Spring MVC & Angular.jsurn:md5:9fb4b177b6beaf739ae919d848d381f82012-07-31T07:00:00+02:002014-03-05T13:23:08+01:00Olivier CroisierArticlesjavajavascriptspring<p>Aujourd'hui plus que jamais, le Javascript a le vent en poupe. On le trouve même <a href="http://nodejs.org/">côté serveur</a> - ce que je trouve personnellement d'une absurdité étourdissante, mais passons.</p>
<p>En ce moment, la mode est aux frameworks MVC côté client ; là, j'y crois déjà un peu plus. Mais il en sort environ un par semaine, et il est difficile de faire son choix, malgré la pléthore de comparatifs qui fleurissent sur le net (<a href="http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/">ici</a>, <a href="http://coding.smashingmagazine.com/2012/07/27/journey-through-the-javascript-mvc-jungle/">là</a>, ou encore <a href="http://getopensource.info/explore/javascript/mvc/">là-bas</a>).</p>
<p>Thoughtworks, de son côté, estime que <a href="http://www.thoughtworks.com/articles/technology-radar-march-2012">la peinture n'est pas encore sèche</a> et qu'il vaut mieux attendre un peu avant de se lancer dans ce genre d'aventure en production. En effet, on a encore très peu de retours d'expérience, et la pérennité des frameworks n'est pas encore démontrée.</p>
<p>Pourtant, dans le tas, il y en a un qui m'a fait de l'oeil : <a href="http://angularjs.org/">Angular.js</a>. Je vous propose donc une petite démonstration de son intégration avec <a href="http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html">Spring MVC</a> côté serveur, pour réaliser une application, totalement originale n'est-ce pas, de "todo-list".</p> <p>La stack
Voyons un peu la stack qui compose l'application.
Angular.js
Pour commencer, donc, Angular.js.
Malgré un nom propice aux jeux de mots les plus graveleux, c'est un projet qui paraît fort bien né. Développé et maintenu par Google (bonus +1 en pérennité) et disponible sous licence MIT, il se base sur l'incontournable JQuery pour... <a href="http://thecodersbreakfast.net/index.php?post/2012/07/30/D%C3%A9velopper-une-application-REST-avec-Spring-MVC-Angular.js"><em>Lire</em> Développer une application REST avec Spring MVC & Angular.js</a></p>http://thecodersbreakfast.net/index.php?post/2012/07/30/D%C3%A9velopper-une-application-REST-avec-Spring-MVC-Angular.js#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/320SUG-France : Lancement du premier Spring User Group français !urn:md5:8a98603f41e77dbb359826c1ca42d9e92010-01-26T10:30:00+01:002010-02-08T23:26:52+01:00Olivier CroisierCommunautéspring <p>J'ai le plaisir de vous annoncer la création du Spring User Group France (SUG-France) !
Sur le même modèle que le Paris JUG, il vise à rassembler tous les deux mois la communauté des utilisateurs de Spring autour de conférences thématiques.
La première conférence, présentée par Arnaud Cogoluègnes[1], aura lieu le jeudi 25 février et portera sur... <a href="http://thecodersbreakfast.net/index.php?post/2010/01/25/SUG-France-%3A-Lancement-premier-Spring-User-Group-fran%C3%A7ais-%21"><em>Lire</em> SUG-France : Lancement du premier Spring User Group français !</a></p>http://thecodersbreakfast.net/index.php?post/2010/01/25/SUG-France-%3A-Lancement-premier-Spring-User-Group-fran%C3%A7ais-%21#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/229VMWare acquiert SpringSourceurn:md5:fc21861904c9038730842f393ed434f42009-08-10T23:30:00+02:002011-02-20T17:35:00+01:00Olivier CroisierDiversspringvmware <p>L'annonce fait l'effet d'une petite bombe dans le milieu du développement Java : le célèbre fournisseur de solutions de virtualisation VMWare serait en pourparlers pour le rachat de SpringSource, le non moins célèbre éditeur à l'origine du framework Spring (entre autres). L'opération, qui se monterait à près de 420 M$ au total, aurait d'ores et... <a href="http://thecodersbreakfast.net/index.php?post/2009/08/10/VMWare-acquiert-SpringSource"><em>Lire</em> VMWare acquiert SpringSource</a></p>http://thecodersbreakfast.net/index.php?post/2009/08/10/VMWare-acquiert-SpringSource#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/206Interfacer Spring et le Service Provider APIurn:md5:df361a9f8a9b07de34f0f986be17b6132009-07-29T00:08:00+02:002010-06-20T19:28:38+02:00Olivier CroisierArticlesjavaspring<p>Je vous ai déjà présenté le <a href="http://thecodersbreakfast.net/index.php?post/2008/12/26/Java-%3A-pr%C3%A9sentation-du-Service-Provider-API">Service Provider API</a> de Java 6+, qui permet de découvrir dynamiquement au runtime les implémentations disponibles d'une interface donnée.<br /></p>
<p>Nous avions également vu qu'il était possible de <a href="http://thecodersbreakfast.net/index.php?post/2009/01/29/D%C3%A9couverte-automatique-de-services-avec-Spring">parvenir à un résultat similaire dans un environnement Spring</a>, grâce à l'import dynamique de ses fichiers de configuration et à un BeanPostProcessor. Toutefois, cela demandait davantage de travail et ne permettait de découvrir que sur des classes expressément déclarées comme beans Spring.</p>
<p>Dans cet article, nous verrons comment interfacer ces deux technologies, de manière à pouvoir injecter dans un contexte Spring des implémentations non-Spring détectés par le Service Provider API.</p> <p>Le service et ses implémentations
Premièrement, il nous faut définir un service, dont les implémentations seront découvertes dynamiquement.
Voici son interface, volontairement très simple :
package net.thecodersbreakfast.spring.service;public interface HelloService{ void sayHello();}
Trois implémentations sont disponibles (EnglishHello,... <a href="http://thecodersbreakfast.net/index.php?post/2009/07/29/Interfacer-Spring-et-le-Service-Provider-API"><em>Lire</em> Interfacer Spring et le Service Provider API</a></p>http://thecodersbreakfast.net/index.php?post/2009/07/29/Interfacer-Spring-et-le-Service-Provider-API#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/204SpringOne, DayTwo - Keynote d'Adrian Colyerurn:md5:a282f2f95f34c2eaef3ab66e721a2aa02009-05-18T21:17:00+02:002009-06-08T23:30:35+02:00Olivier CroisierCommunautécommunautéjavaspring<p>La deuxième journée de la conférence <a href="http://europe.springone.com/europe-2009">SpringOne'09</a> s'est ouverte sur la Keynote d'<a href="http://americas.springone.com/conference/speaker/adrian_colyer.html">Adrian Colyer</a>.</p>
<p>Faisant preuve de beaucoup d'humour (sauce Monty Python) et accompagné d'une marionnette de canard (qui semble être un personnage récurrent de ses shows), il a rappelé le positionnement stratégique de SpringSource en entreprise : fournir les outils permettant de diminuer drastiquement le "time-to-live" (ou "time-to-value"), c'est-à-dire le temps entre l'identification d'un besoin métier et la mise en production du produit y répondant.</p>
<p>Reconnaissant que la productivité d'un département informatique dans son ensemble est directement dépendante de celle ses différentes équipes, SpringSource a élaboré une stratégie globale couvrant l'ensemble de la chaîne de production, du développement à l'exploitation. Si les développeurs en ont été historiquement les premiers bénéficiaires (<a href="http://www.springsource.org/about">Spring framework</a>, <a href="http://groovy.codehaus.org/">Groovy</a>, <a href="http://springide.org/blog/">Spring IDE</a>, <a href="http://www.springsource.com/products/tcserver">TC server</a>...), c'est maintenant au tour des équipes d'infrastructure et d'exploitation de se voir proposer disposer des outils puissants et des solutions innovantes.</p> <p>Sofware as a Service
L'agilité est difficile à atteindre au niveau des datacenters.
Provisionner les serveurs, les installer et les configurer demande du temps, de la place et des ressources humaines importantes. Il n'est donc pas rare d'observer des délais de mise en place de l'ordre du mois, ce qui est très pénalisant pour les entreprises.... <a href="http://thecodersbreakfast.net/index.php?post/2009/05/18/SpringOne%2C-DayTwo-Keynote-d-Adrian-Colyer"><em>Lire</em> SpringOne, DayTwo - Keynote d'Adrian Colyer</a></p>http://thecodersbreakfast.net/index.php?post/2009/05/18/SpringOne%2C-DayTwo-Keynote-d-Adrian-Colyer#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/186SpringOne : Questions pour des championsurn:md5:c14bf237d5cec99a8d5941d650a27fcf2009-04-29T01:46:00+02:002009-06-08T23:30:35+02:00Olivier CroisierCommunautégroovyspring<p>Vu les pointures qu'on croise à SpringOne, j'aurais été fou de me priver de poser des questions. Des questions naïves de préférence, lancées un peu au hasard, mais qui peuvent fournir des réponses intéressantes, voire un scoop ou deux.</p> <p>J'ai d'abord demandé à Guillaume Laforge ce que l'inclusion de la fonction invokedynamics dans Java7 changerait pour Groovy.
Guillaume explique que le processus de résolution des méthodes (qui permet de déterminer quel bytecode exécuter à l'appel d'une méthode) est relativement coûteux en Groovy : non seulement le langage Java lui-même est complexe... <a href="http://thecodersbreakfast.net/index.php?post/2009/04/29/SpringOne-%3A-Questions-pour-des-champions"><em>Lire</em> SpringOne : Questions pour des champions</a></p>http://thecodersbreakfast.net/index.php?post/2009/04/29/SpringOne-%3A-Questions-pour-des-champions#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/185SpringOne, DayOne - Keynote de Rod Johnsonurn:md5:de4d508d619db0c28b3dad5e478fbf232009-04-27T23:55:00+02:002009-06-08T23:30:35+02:00Olivier CroisierCommunautéjavaspringtomcat<p><a href="http://europe.springone.com/europe-2009">SpringOne</a>, premier jour.</p>
<p>Malgré un ciel bas et lourd (avec un soupçon de pluie) pesant comme un couvercle sur l'esprit gémissant en proie aux longs ennuis des passagers du Thalys (2h de retard, merci bien), j'ai tout de même rejoint Amsterdam à temps pour assister à la fameuse Keynote de <a href="http://europe.springone.com/europe-2009/speaker/Rod+Johnson">Rod Johnson</a>, qui ouvrait la conférence.</p>
<p>Au programme, son analyse de l'actualité et sa vision du futur de Java, puis un tour d'horizon du portfolio SpringSource, et même quelques annonces exclusives. Suivez le guide !</p> <p>The future of Java innovation
Personne n'est resté insensible à l'annonce du rachat de Sun Microsystems par Oracle, pour la modique somme de 7.4 milliards de dollars (soit 237,95€ au cours du jour), et la communauté Java se demande à quelle sauce elle va être mangée. Quelles sont les motivations d'Oracle ? Est-ce un simple mouvement stratégique... <a href="http://thecodersbreakfast.net/index.php?post/2009/04/27/SpringOne%2C-DayOne-Keynote-de-Rod-Johnson"><em>Lire</em> SpringOne, DayOne - Keynote de Rod Johnson</a></p>http://thecodersbreakfast.net/index.php?post/2009/04/27/SpringOne%2C-DayOne-Keynote-de-Rod-Johnson#comment-formhttp://thecodersbreakfast.net/index.php?feed/atom/comments/184