Ce support de cours contient les concepts fondamentaux de la sécurité des applications Web Statless avec Json Web Token. Des applications de mise en oeuvre de JWT et Spring Security pour les applications basées sur les Micro-services sont publiées ma chaîne vidéo Youtube :
https://www.youtube.com/user/mohamedYoussfi
Le code source des applications est publié sur mon compte GitHUB:
https://github.com/mohamedYoussfi/
Bon apprentissage
Cette présentation donne une idée bien détaillée sur les web services. Elle présente aussi les types de web services(SOAP, REST), et enfin comment les développer dans le langage de programmation java.
Découvrez le framework web Spring Boot qui a la cote !
Apprenez comment son système d'auto-configuration fonctionne.
Live coding et exemple de migration vers Spring Boot sont de la partie.
Présentation d'un cours en JAVA/J2EE
Création et manipulations des objets en Java
** Connexion JDBC à la base de données
** Modèle en couches
** FrameworkHibernate
** Framewoek Spring MVC
Ce support de cours contient les concepts fondamentaux de la sécurité des applications Web Statless avec Json Web Token. Des applications de mise en oeuvre de JWT et Spring Security pour les applications basées sur les Micro-services sont publiées ma chaîne vidéo Youtube :
https://www.youtube.com/user/mohamedYoussfi
Le code source des applications est publié sur mon compte GitHUB:
https://github.com/mohamedYoussfi/
Bon apprentissage
Cette présentation donne une idée bien détaillée sur les web services. Elle présente aussi les types de web services(SOAP, REST), et enfin comment les développer dans le langage de programmation java.
Découvrez le framework web Spring Boot qui a la cote !
Apprenez comment son système d'auto-configuration fonctionne.
Live coding et exemple de migration vers Spring Boot sont de la partie.
Présentation d'un cours en JAVA/J2EE
Création et manipulations des objets en Java
** Connexion JDBC à la base de données
** Modèle en couches
** FrameworkHibernate
** Framewoek Spring MVC
Nest.js is a Node.js framework that uses an architecture-oriented approach to build scalable and loosely coupled applications. It is inspired by Angular and uses modules, dependency injection, and other features to build progressive web apps. Nest.js allows developers to split code into reusable units and easily integrate with databases and other technologies through a clean architecture.
Ce Support de cours Spring contient :
- Architecture JEE (Over view)
- Spring Overview
- Spring IOC
- Spring MVC
- Spring Integration (RMI, JaxWS, JaxRS, JMS, JMX,...)
- Spring Security
Bon apprentissage à tous
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
Les ORM, c’est pratique. Mais cela peut rapidement devenir complexe ou subtile. JPA permet de rapidement modéliser la couche d’accès aux données avec une facilité indiscutable. Cependant, il est préférable de bien en comprendre le fonctionnement pour éviter quelques anti patterns fâcheux.
La formation JPA Avancé proposée par Ippon détaille les aspects techniques et permet d’aller plus loin dans la compréhension et la maîtrise. Enrichie par des TP très fournis lorsqu’elle est dispensée par les formateurs Ippon, elle permet d’assimiler en 3 jours les subtilités et offre les outils pour réaliser une couche d’accès aux données de qualité, performante et maintenable.
Techniques de modélisation, gestion et subtilités du cache (L1, L2), mécanismes transactionnels, langage de requêtage… Tous ces aspects et bien d’autres sont détaillés et illustrés afin de vous apporter les clefs pour vos prochains projets.
Découvrez dès aujourd’hui les slides de cette formation, mis à disposition dans le cadre de l’OpenFormation.
Support Complet sur la technologie EJB 3.1. Ce cours Traite l'architecture JEE. Les différents types EJB (Session, Entity, MDB). Des exemple complets sont aussi présentés.
Exemple d'application qui montre comment utiliser les bonnes pratiques de JEE pour développer un site web de commerce électronique en utilisant les outils :
- Eclipse comme environnement de développement
- Maven comme outil d’intégration
- JUnit comme Framework des tsts unitaire
- Spring IOC pour l'inversion de contrôle
- Spring MVC pour la couche web
- Spring Security pour la sécurité
- JPA, Hibernate
- Web Service SOAP
- Web Service REST
- Service RMI
The document discusses Spring Expression Language (SpEL), which is a powerful expression language for querying and manipulating objects in the Spring Framework. SpEL supports expressions, property access, method invocation, operators, and more. It can be used across Spring products and in XML configuration, annotations, and code. SpEL provides a simple and consistent way to access application objects and metadata.
22nd of May - Graph DB Meetup @ Lyon, FR
Contents in French this time
Details all capabilities offered by Neo4j.
More info : http://www.meetup.com/graphdb-Lyon/events/175401022/
Please not all attendants were techies, that's why I felt compelled to remind what Spring is and is not.
Nest.js is a Node.js framework that uses an architecture-oriented approach to build scalable and loosely coupled applications. It is inspired by Angular and uses modules, dependency injection, and other features to build progressive web apps. Nest.js allows developers to split code into reusable units and easily integrate with databases and other technologies through a clean architecture.
Ce Support de cours Spring contient :
- Architecture JEE (Over view)
- Spring Overview
- Spring IOC
- Spring MVC
- Spring Integration (RMI, JaxWS, JaxRS, JMS, JMX,...)
- Spring Security
Bon apprentissage à tous
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
Les ORM, c’est pratique. Mais cela peut rapidement devenir complexe ou subtile. JPA permet de rapidement modéliser la couche d’accès aux données avec une facilité indiscutable. Cependant, il est préférable de bien en comprendre le fonctionnement pour éviter quelques anti patterns fâcheux.
La formation JPA Avancé proposée par Ippon détaille les aspects techniques et permet d’aller plus loin dans la compréhension et la maîtrise. Enrichie par des TP très fournis lorsqu’elle est dispensée par les formateurs Ippon, elle permet d’assimiler en 3 jours les subtilités et offre les outils pour réaliser une couche d’accès aux données de qualité, performante et maintenable.
Techniques de modélisation, gestion et subtilités du cache (L1, L2), mécanismes transactionnels, langage de requêtage… Tous ces aspects et bien d’autres sont détaillés et illustrés afin de vous apporter les clefs pour vos prochains projets.
Découvrez dès aujourd’hui les slides de cette formation, mis à disposition dans le cadre de l’OpenFormation.
Support Complet sur la technologie EJB 3.1. Ce cours Traite l'architecture JEE. Les différents types EJB (Session, Entity, MDB). Des exemple complets sont aussi présentés.
Exemple d'application qui montre comment utiliser les bonnes pratiques de JEE pour développer un site web de commerce électronique en utilisant les outils :
- Eclipse comme environnement de développement
- Maven comme outil d’intégration
- JUnit comme Framework des tsts unitaire
- Spring IOC pour l'inversion de contrôle
- Spring MVC pour la couche web
- Spring Security pour la sécurité
- JPA, Hibernate
- Web Service SOAP
- Web Service REST
- Service RMI
The document discusses Spring Expression Language (SpEL), which is a powerful expression language for querying and manipulating objects in the Spring Framework. SpEL supports expressions, property access, method invocation, operators, and more. It can be used across Spring products and in XML configuration, annotations, and code. SpEL provides a simple and consistent way to access application objects and metadata.
22nd of May - Graph DB Meetup @ Lyon, FR
Contents in French this time
Details all capabilities offered by Neo4j.
More info : http://www.meetup.com/graphdb-Lyon/events/175401022/
Please not all attendants were techies, that's why I felt compelled to remind what Spring is and is not.
Programmation Android - 09 - Web servicesYann Caron
Voici le cours sur android que j'enseigne à l'ENSG
Retrouvez tous le cours et le TP sur GitHub :
https://github.com/YannCaron/Android-ENSG
Si vous avez des besoin en formation, n'hésitez pas à me contacter : CyaNn (at) gmail (dot) com
Présentation sur la démarche de l'Open Data (quelles données ? Quels acteurs ?) et sur les technologies gravitant autour du Linked Data (le modèle RDF, RDFS, OWL, les ontologies, les triplestores, etc).
Similaire à Présentation spring data Matthieu Briend (16)
Du 7 au 9 mai aura lieu la conférence Microsoft //Build, LA conférence des développeurs Microsoft.
A peine le temps de digérer les nombreuses sessions proposées par Microsoft que nos MVP vous présentent une synthèse des principales annonces.
L’« entreprise libérée », buzzword du moment, fait couler beaucoup d’encre ces dernières années. Libérée ? De qui, de quoi ? Mais que cache cette expression ?
Nous retracerons l’évolution de l’organisation des hommes et du management, pour s’intéresser à cette nouvelle forme d’organisation qui remet l’humain au centre de l’entreprise.
Quelles sont les caractéristiques de celle-ci ? Quelles pratiques diffèrent des entreprises classiques ? Et surtout comment faire pour devenir une entreprise libérée et pour quels bénéfices ?
Que vous soyez développeurs, managers, chefs de projet, Scrum Master, RH, commerciaux ou dirigeants, je vous invite à découvrir ce nouveau paradigme d’organisation et de management, qui veut réconcilier deux concepts a priori incompatibles : Bonheur et Travail. Alors, info ou intox ?
Amélioration continue, c'est l'affaire de tous !SOAT
Popularisée par Toyota dans les années 50, est au cœur du processus Agile. L’idée majeure est de se dire qu’il y a toujours moyen, quel que soit le processus utilisé, de le rendre plus performant. Tout processus, aussi optimal soit-il, s’inscrit dans un contexte évolutif et perd donc de son efficacité avec le temps s’il n’est pas continuellement revu ou amélioré.
Reste que dans l’univers informatique, on a trop souvent tendance à cantonner cette démarche aux seules équipes de développement alors qu’elle peut être élargie à toutes les fonctions stratégiques d’une organisation. Nous allons voir lors de cette conférence, comment élargir cette approche en y impliquant toutes les étapes d’un projet et en travaillant sur les interactions entre ses différents acteurs.
L’amélioration continue ne pouvant se réduire à une maîtrise optimisée des processus, nous verrons dans quelle mesure elle induit également une nouvelle politique de partage des connaissances pour faire émerger une véritable « intelligence collective ».
JAVA 8 : Migration et enjeux stratégiques en entrepriseSOAT
La sortie de Java 8 est une véritable révolution dont l’enjeu dépasse de loin la simple évolution d’un langage et de ses APIs. Rdv sur notre chaîne Youtube pour revoir la conférence :
Après une version 7 peu convaincante, la version 8 replace Java au premier rang des langages objets actuels.
En parfaite adéquation avec les besoins des projets et les possibilités offertes par les environnements matériels actuels, cette nouvelle version apporte une modernisation du langage et de ses API, un suivi des performances des processeurs et des améliorations de la JVM.
Quels sont les nouveaux concepts introduits par Java 8 ? En quoi les expressions lambdas et l’API Stream représentent une avancée majeure de la plateforme ? Quelle stratégie adopter pour migrer vers Java 8 en toute sécurité et en diminuant au maximum sa dette technique ?
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESSOAT
Les systèmes distribués ont largement évolués ces 10 dernières années, passant d’énormes applications monolithiques à de petits containers de services, apportant plus de souplesse et d’agilité au sein des systèmes d’information.
Le terme « Architecture microservice » a vu le jour pour décrire cette manière particulière de concevoir des applications logicielles.
Bien qu’il n’y ait pas de définition précise de ce style d’architecture, elles ont un certain nombre de caractéristiques communes basées autour de l’organisation de l’entreprise, du déploiement automatisé et de la décentralisation du contrôle du langage et des données.
Seulement, développer ces systèmes peut tourner au véritable casse-tête. Je vous propose donc un tour des concepts et différentes caractéristiques de ce type d’architecture, des bonnes et mauvaises pratiques, de la création jusqu’au déploiement des applications.
3/3 : The path to CDI 2.0 - Antoine Sabot-DurandSOAT
Allez plus Loin avec CDI
En moins de 5 ans d’existence, Contexts and Dependency Injection (CDI) est devenue l’une des principale spécification de Java EE. Néanmoins, CDI est bien souvent perçu comme une simple solution d’injection de dépendance enrichie alors que cette spécification est bien plus riche que ça. Lors de cette présentation, après un rapide rappel des fonctionnalités de base de CDI, nous montrerons comment son utilisation avancée permet Java EE en intégrant des technologies legacy ou plus récent de manière naturelle. Nous finirons avec le travail en cours sur CDI 2.0 qui a commencé début septembre.
1/3 : introduction to CDI - Antoine Sabot-DurandSOAT
Allez plus Loin avec CDI
En moins de 5 ans d’existence, Contexts and Dependency Injection (CDI) est devenue l’une des principale spécification de Java EE. Néanmoins, CDI est bien souvent perçu comme une simple solution d’injection de dépendance enrichie alors que cette spécification est bien plus riche que ça. Lors de cette présentation, après un rapide rappel des fonctionnalités de base de CDI, nous montrerons comment son utilisation avancée permet Java EE en intégrant des technologies legacy ou plus récent de manière naturelle. Nous finirons avec le travail en cours sur CDI 2.0 qui a commencé début septembre.
Allez plus Loin avec CDI
En moins de 5 ans d’existence, Contexts and Dependency Injection (CDI) est devenue l’une des principale spécification de Java EE. Néanmoins, CDI est bien souvent perçu comme une simple solution d’injection de dépendance enrichie alors que cette spécification est bien plus riche que ça. Lors de cette présentation, après un rapide rappel des fonctionnalités de base de CDI, nous montrerons comment son utilisation avancée permet Java EE en intégrant des technologies legacy ou plus récent de manière naturelle. Nous finirons avec le travail en cours sur CDI 2.0 qui a commencé début septembre.
Javascript s’est depuis longtemps imposé comme le principal langage pour développer des écrans web dynamiques. L'émergence des SPA (Single Page Application) est en fait l'aboutissement logique du succès de ces outils au premier rang desquels on compte jQuery et AJAX.
AngularJS fait partie d’une nouvelle génération de frameworks qui propose d’aller plus loin afin d’avoir non seulement des SPA améliorant l’expérience utilisateur mais aussi un code mieux organisé, plus modulaire et donc facilement testable.
Au cours de cette soirée, vous verrez d’abord la manière dont AngularJS étend le HTML à travers les directives puis le binding bidirectionnel, ensuite, la programmation asynchrone avec AngularJS. Enfin pour finir, nous allons voir ces petits plus qui expliquent la popularité du framework : les filtres, l’injection de dépendance et les tests.
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014SOAT
Les applications sont de plus en plus interconnectées. Une architecture type WOA (Web Oriented Archiecture) et l’utilisation des micros-services nécessitent de faire de plus en plus appel à différents services web.
Comment composer un résultat à partir de ces différents services, sans avoir à ce soucier de l’ordre dans lequel les serveurs vont répondre ?
RxJava offre une manière élégante de faire de l’asynchrone et de la composition au sein de son application. David vous exposera les concepts de Rx (Reactive eXtension) avant de vous montrer une mise en application avec des exemples de code venant d’une application Android.
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...SOAT
Plus de 50% des internautes français utilisent un support mobile pour naviguer sur le web. Il est donc temps de repenser votre stratégie mobile et le Responsive Web Design, consistant à ne faire qu’un seul site adapté au périphérique qui l’affiche, constitue une approche possible.
Après une introduction à ses principes, nous verrons qu’au-delà des défis techniques, le RWD suppose de revoir entièrement le processus de développement d’un site web et les méthodes de travail des équipes, que ce soit en phase de conception ou lors des tests.
Cette conférence sera l’occasion de découvrir les nouveaux challenges à relever par vos équipes lors de la conception de vos prochains sites internet.
Nio sur Netty par Mouhcine Moulou - 3 avril 2014SOAT
La vidéo de cette conférence est visible ici : http://youtu.be/T7r7UlSoe7k
La croissance continue du Web a accru la nécessité pour les applications Client/serveur de gérer la monté en charge et la performance. Heureusement, Java est livré avec les outils nécessaires pour créer des applications performantes, et scalables ! Les premières versions de Java incluent le support des communications réseau avec la jdk 1.4 qui a introduit l'API NIO. La nouvelle version, NIO 2, introduite dans Java 7, a été conçue pour permettre l'écriture asynchrone en réseau, Aujourd'hui, encore peu de gens s'intéressent au développement d'applications réseaux, car l'API Jdk reste complexe.
Netty est une bibliothèque Java pour l'écriture d'applications et de services réseau hautement concurrent et scalable. Netty est une API complétement asynchrone : l'Api vous propose une nouvelle façon de développer vos applications réseau en assurant un découplage entre votre logique métier et les traitements réseau grâce à son modèle basé sur une architecture "event-driven".
Dans cette conférence, vous comprendrez l'architecture de Netty, et comment des entreprises comme Twitter, Facebook, RedHat et autres l'utilisent pour répondre à leurs problématiques de communication réseau.
- le niveau : développeurs Java débutants et expérimentés
- la durée : 2h
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...SOAT
Développer des applications iOS et Android avec C# grâce à Xamarin par Cyril Cathala
A l’ère des smartphones et tablettes, le développement multiplateforme se révèle être un challenge : quelle solution choisir et comment minimiser les coûts, tout en optimisant l’expérience utilisateur ?
Parmi les solutions disponibles sur le marché, Xamarin s’adresse aux développeurs C# pour la création d’applications compatibles avec Windows 8, iOS et Android. Son approche multiplateforme permet de développer des applications natives de qualité en mutualisant jusqu’à 75% de code entre les différents OS.
Ce petit déjeuner sera l’occasion de faire un tour d’horizon des outils du marché, d’apprécier toutes les possibilités offertes par Xamarin et d’en explorer les pistes pour aller plus loin.
Amazon Web Service par Bertrand Lehurt - 11 mars 2014SOAT
Attention, soirée spécial cloud computing!
IAAS, PASS, SAAS... Perdu avec autant d'acronyme qui représente des types de cloud computing?
Ça tombe bien, Bertrand Lehurt vous propose une soirée d'introduction à l'IAAS (Infrastructure As A Service) avec Amazon Web Services, suivi d'une séance les mains dans le cambouis.
Vous allez apprendre à déployer une petite application en utilisant les services nécessaires dans la jungle de ceux proposés (plus de 37). Au cours de la soirée, nous aborderons donc l'utilisation d'EC2, S3, ELB, EBS, Cloudfront et Auto scaling et les architectures types qui sont utilisées dans le cloud computing.
La vidéo de la présentation est visible ici : http://youtu.be/0AUJ_hcMNhQ
ASP.Net Web API - Léonard Labat (18 février 2014)SOAT
HTTP est un protocole simple à comprendre, simple à utiliser et c’est cette simplicité qui le rend disponible sur un grand nombre de plate-forme. REST, de son côté, est un style d’architecture qui permet d’exposer facilement une API en utilisant HTTP et différents types de représentations de données tels que JSON ou XML.
ASP.NET Web API est une évolution de WCF pour écrire une couche d’API REST, en utilisant un modèle de programmation proche d’ASP.NET MVC. Cette soirée 3T sera l’occasion pour vous de découvrir les fonctionnalités offertes par ASP.NET Web API qui font que c’est une technologie qu’il faut envisager d’utiliser lorsque vous devez créer une API REST.
Xamarin et le développement natif d’applications Android, iOS et Windows en C#SOAT
Une mise à jour de cette présentation est disponible ici : http://fr.slideshare.net/soatexpert/dvelopper-des-applications-i-os-et-android-avec-c-grce-xamarin
*********************
Les slides de la conférence présentée par Cyril Cathala chez Soat le 04/03/2014 sur le thème : Xamarin et le développement natif d’applications Android, iOS et Windows en C#
La vidéo de la présentation est visible ici : http://youtu.be/0BF9NqLYNvQ
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...Horgix
This is the slide deck of a talk by Alexis "Horgix" Chotard and Laurentiu Capatina presented at the MongoDB Paris User Group in June 2024 about the feedback on how PayFit move away from a monolithic hell of a self-hosted MongoDB cluster to managed alternatives. Pitch below.
March 15, 2023, 6:59 AM: a MongoDB cluster collapses. Tough luck, this cluster contains 95% of user data and is absolutely vital for even minimal operation of our application. To worsen matters, this cluster is 7 years behind on versions, is not scalable, and barely observable. Furthermore, even the data model would quickly raise eyebrows: applications communicating with each other by reading/writing in the same MongoDB documents, documents reaching the maximum limit of 16MiB with hundreds of levels of nesting, and so forth. The incident will last several days and result in the loss of many users. We've seen better scenarios.
Let's explore how PayFit found itself in this hellish situation and, more importantly, how we managed to overcome it!
On the agenda: technical stabilization, untangling data models, breaking apart a Single Point of Failure (SPOF) into several elements with a more restricted blast radius, transitioning to managed services, improving internal accesses, regaining control over risky operations, and ultimately, approaching a technical migration when it impacts all development teams.
4. Spring Data - Introduction
⦿Utilité du pattern DAO ?
⦿Hétérogénéité des bases de données
2013-11-15
Spring Data - 20131114
4
5. Spring Data - Introduction
⦿Module Spring
⦿Son but :
⦿Faciliter l’écriture des couches d’accès aux
données
⦿Tenter d’offrir une abstraction commune pour
l’accès aux données quelques soient les sources
de données sous-jacentes, tout en prenant en
compte les spécificités de celles-ci
⦿Sources de données : JPA, Neo4j, MongoDB,
GemFire, Hadoop, ElasticSearch, REST, Redis, Couchbase, …
2013-11-15
Spring Data - 20131114
5
6. Spring Data
API de manipulation de
la source de données
(JPA, Neo4j, MongoDB,
etc.)
Manipule
Spring Data
Source de
données
2013-11-15
Spring Data – 20131114
6
7. Spring Data
Spring Data JPA
Spring Data
Neo4j
Spring Data
MongoDB
Spring Data
Gemfire
Spring Data Commons
2013-11-15
Spring Data – 20131114
7
11. Spring Data JPA
⦿Spring Data JPA offre une couche
d’abstraction supplémentaire par rapport à
JPA
⦿Se charge de l'implémentation des
fonctionnalités les plus courantes des DAO
⦿On se concentre sur l’essentiel : l’écriture des
requêtes
2013-11-15
Spring Data - 20131114 - sdjpabase
11
13. Spring Data JPA
⦿Pour l'intégrer, il suffit d'ajouter une
dépendance dans Maven :
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
2013-11-15
Spring Data - 20131114 - sdjpabase
13
14. Spring Data JPA
⦿Principe de base
⦿Pour écrire le DAO pour un type d’entités, il
faut étendre certaines interfaces fournies par
Spring Data :
public interface PersonneDao extends CrudRepository<Personne, Long> {
}
Nom de l'entité qu'on manipule
Type de l'identifiant de l'entité
2013-11-15
Spring Data - 20131114 - sdjpabase
14
15. Spring Data JPA
⦿Les différentes interfaces :
⦿Repository : vous ne ferez pas grand-chose avec,
hormis les méthodes que vous ajouterez
⦿CrudRepository : vous aurez des fonctionnalités
CRUD de base
⦿PagingAndSortingRepository : vous aurez en plus
des méthodes pour la pagination et le tri
⦿JpaRepository : vous aurez en plus des méthodes
propres à JPA
2013-11-15
Spring Data - 20131114 - sdjpabase
15
16. Spring Data JPA
Spring Data Commons
Repository
CrudRepository
PagingAndSortingRepository
JpaRepository
Pas de méthode
save(S), findOne(ID), exists(), findAll(), deleteAll(), …
findAll(Sort), findAll(Pageable)
flush(), saveAndFlush(T), deleteInBatch(Iterable<T>), …
Spring Data JPA
2013-11-15
Spring Data - 20131114 - sdjpabase
16
17. Spring Data JPA
⦿ CrudRepository :
public interface PersonneDao extends CrudRepository<Personne, Long> {}
public class PersonneDaoTest {
@Autowired
private PersonneDao personneDao;
public void setup() {
personneDao.deleteAll();
}
public void testSave() { …
Personne personneSauvee = personneDao.save(personne);
…}
public void testCrudDao() {…
Assert.assertEquals(1, personneDao.count());
Assert.assertEquals(true, personneDao.exists(personneSauvee.getId()));
for (Personne personneDeLaListe : personneDao.findAll()) {…}
Personne personneTrouvee = personneDao.findOne(personneSauvee.getId());
personneDao.delete(personneSauvee);
Assert.assertEquals(0, personneDao.count());…
}
2013-11-15
Spring Data - 20131114 - sdjpabase
17
18. Spring Data JPA
⦿ PagingAndSortingRepository :
public interface PersonnePaginationDao extends PagingAndSortingRepository<Personne, Long>{}
public class PersonnePaginationDaoTest {
private PersonnePaginationDao personnePaginationDao;
public void testTriDesc(){…
Iterable<Personne> personnesTrouvees =
personnePaginationDao.findAll(new Sort(Sort.Direction.DESC, "nom"));
…}
public void testPagination() {
Assert.assertEquals(10, personnePaginationDao.count());
Page<Personne> personnes =
personnePaginationDao.findAll(new PageRequest(1, 3));
Assert.assertEquals(1, personnes.getNumber());
Assert.assertEquals(3, personnes.getSize()); // la taille de la pagination
Assert.assertEquals(10, personnes.getTotalElements()); //nb total d'éléments récupérables
Assert.assertEquals(4, personnes.getTotalPages()); // nombre de pages
Assert.assertTrue(personnes.hasContent());
…}
}
2013-11-15
Spring Data - 20131114 - sdjpabase
18
19. Spring Data JPA
⦿Vous pouvez filtrer les méthodes que vous
voulez être utilisables : il suffit de les copier
dans votre interface qui étendra l'interface
Spring la plus restrictive
⦿Par exemple, pour n'avoir que les méthodes
findOne et save :
interface MyBaseRepository<T, ID extends Serializable>
extends Repository<T, ID> {
T findOne(ID id);
T save(T entity);
}
2013-11-15
Spring Data - 20131114 - sdjpabase
19
20. Spring Data JPA
⦿ Vous pouvez aussi écrire une requête juste avec le nom de la méthode
⦿ Exemple :
public interface RequetesPersonnaliseesDao
extends CrudRepository<Personne, Long> {
public Personne findByNom(String nom);
public Personne findByNomOrPrenom(String nom,
String prenom);
public Personne findByVelo(Velo velo);
public Personne findByVeloAndNom(Velo velo, String nom);
…}
List<Person> findDistinctPeopleByLastnameOrFirstname(String
lastname, String firstname);
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String
lastname, String firstname);
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
2013-11-15
Spring Data - 20131114 - sdjpabase
20
21. Spring Data JPA
Logique
GreaterThan, IsGreaterThan
IN
In, IsIn
IS
Is, Equals, (or no keyword)
IS_NOT_NULL
NotNull, IsNotNull
IS_NULL
Null, IsNull
LESS_THAN
LessThan, IsLessThan
LIKE
Like, IsLike
NOT
Not, IsNot
NotIn, IsNotIn
NOT_LIKE
NotLike, IsNotLike
REGEX
Regex, MatchesRegex,
Matches
…
2013-11-15
GREATER_THAN
NOT_IN
⦿Il existe une série
de mots-clés pour
écrire sa requête
(cf. annexe de la
documentation de
référence)
Mot-clé Spring Data
…
Spring Data - 20131114 - sdjpabase
21
22. Spring Data JPA
⦿Spring va créer une requête à partir des
propriétés et des mots-clés mentionnés dans le
nom de la méthode
⦿Si on fait une recherche à partir d’une « souspropriété », on donne à Spring le chemin vers
celle-ci. Exemple : Si Person a une propriété
Address qui a une propriété ZipCode, on peut
faire :
List<Person>
findByAddressZipCode(ZipCode zipCode);
2013-11-15
Spring Data - 20131114 - sdjpabase
22
23. Spring Data JPA
⦿S’il y a ambiguïté dans les propriétés, on peut
mettre un « _ ». Exemple :
Si la classe Person a un attribut addressZip et un
autre address (de type Address qui contient
ZipCode) :
List<Person>
findByAddress_ZipCode(ZipCode
zipCode);
2013-11-15
Spring Data - 20131114 - sdjpabase
23
24. Spring Data JPA
⦿Certains types de Spring sont
automatiquement reconnus. Du coup, on
peut ajouter des paramètres de pagination et
de tri :
Page<User> findByLastname(String
lastname, Pageable pageable);
List<User> findByLastname(String
lastname, Sort sort);
List<User> findByLastname(String
lastname, Pageable pageable);
2013-11-15
Spring Data - 20131114 - sdjpabase
24
25. Spring Data JPA
⦿Exemple :
public interface RequetesPersonnaliseesDao
extends CrudRepository<Personne, Long> {
public List<Personne> findByNomStartingWith(String nom,
Sort ordreTri);
}
public void testRecuperationParNomEtTri() {
String baseNom = "aaa";
// sauvegarde des personnes avec pour nom : "baseNom"+i, avec i={0, 1, 2, 3}
final List<Personne> listePersonnes =
this.requetesPersonnaliseesDao.findByNomStartingWith(baseNom,
new Sort(Direction.DESC, "nom"));
for (Personne personne : listePersonnes)
{ System.out.println(personne.getNom()); }
}
Affiche : aaa3, aaa2, aaa1, aaa0
2013-11-15
Spring Data - 20131114 - sdjpabase
25
26. Spring Data JPA
⦿Requêtes nommées :
⦿On peut les mettre dans le META-INF/orm.xml ou en
annotations dans l’entité
⦿Exemple :
@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User { …
}
⦿Et dans le répository, on ne fait que déclarer la méthode :
public interface UserRepository
extends JpaRepository<User, Long> {
User findByEmailAddress(String emailAddress);
}
2013-11-15
Spring Data - 20131114 - sdjpabase
26
27. Spring Data JPA
⦿ Vous pouvez aussi ajouter l’annotation @Query si vos noms
de méthodes sont beaucoup trop longues
⦿ Exemple :
@Query("from Personne p where p.nom = ?1 and p.prenom = ?2")
public Personne
maRequêteAvecQueryDeRechercheParNomEtPrenom(String nom,
String prenom);
⦿ Ca marche aussi avec les requêtes de modification, pour
lesquelles il faut l’annotation @Modifying :
@Query("update Personne p set p.nom = :nom where p.id = :id")
@Modifying
public int metAJourNom(@Param("nom")String nom,
@Param("id") Long id);
⦿ On peut nommer les paramètres avec @Param
2013-11-15
Spring Data - 20131114 - sdjpabase
27
28. Spring Data JPA
⦿On peut mettre plusieurs arguments que
Spring comprendra en fonction de leur
déclaration dans la méthode
@Query("from Personne p where p.nom = ?1 and p.prenom = ?2")
public Personne maRequêteAvecQueryDeRechercheParNomEtPrenom(String
nom, String prenom);
⦿@Query prend l’ascendant sur les requêtes
nommées
2013-11-15
Spring Data - 20131114 - sdjpabase
28
29. Spring Data JPA
⦿Que ce soit pour @Query ou @NamedQuery,
on peut mettre du code SQL natif
(respectivement avec l’attribut nativeQuery
et @NamedNativeQuery)
2013-11-15
Spring Data - 20131114 - sdjpabase
29
30. Spring Data JPA
⦿3 stratégies pour dire à Spring comment
récupérer les requêtes :
⦿CREATE : à partir des noms des méthodes
⦿USE_DECLARED_QUERY : annotations, requêtes
nommées ou tout autre moyen propre à la
source de données sous-jacente
⦿CREATE_IF_NOT_FOUND : recherche d’abord une
requête associée, puis crée la requête à partir du
nom de la méthode
⦿Déclaré dans la configuration Spring
2013-11-15
Spring Data - 20131114 - sdjpabase
30
31. Spring Data JPA
⦿ Comment configurer Spring Data JPA avec Hibernate et H2 :
<!-- Déclaration des paquetages contenant les DAO -->
<jpa:repositories base-package="fr.soat.springdata.jpa.dao" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- <property name="persistenceUnitName" value="spring-jpa" /> utile si
on a un persistence.xml -->
<property name="packagesToScan" value="fr.soat.springdata.jpa.entites" /> <!-- pour se débarasser du
persistence.xml -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="database" value="H2" />
</bean>
</property>
</bean>
<jdbc:embedded-database id="dataSource" type="H2" />
2013-11-15
Spring Data - 20131114 - sdjpabase
31
32. Spring Data JPA
⦿La balise <repositories /> existe pour chaque
module de Spring Data
⦿Spring scanne les paquetages mentionnés à la
recherche de Repository
⦿Pour chaque interface trouvée, Spring va créer le
FactoryBean qui va construire le proxy qui va
traiter les appels
⦿Spring active la récupération des exceptions
levées par la source de données et les convertit
en DataAccessException
2013-11-15
Spring Data - 20131114 - sdjpabase
32
33. Spring Data JPA
⦿Les requêtes personnalisées
⦿2 possibilités :
⦿Soit vous voulez écrire une méthode
personnalisée pour tous les DAO
⦿Soit vous voulez juste ajouter une méthode
personnalisée pour un DAO
2013-11-15
Spring Data - 20131114 - sdjpabase
33
34. Spring Data JPA
⦿
Ajouter une méthode personnalisée
pour tous les DAO
⦿
L’applicationContext.xml devra être
modifié :
<jpa:repositories
base-package="fr.soat.springdata.jpa.dao"
factory-class=
"fr.soat.springdata.jpa.dao.personnalisees.tous.DaoCommunAuxAutresD
aoFactoryBean"
/>
2013-11-15
Spring Data - 20131114 - sdjpabase
34
35. Spring Data JPA
⦿
Ajouter une méthode personnalisée pour
tous les DAO
⦿ FactoryBean devra être créé :
Un
public class DaoCommunAuxAutresDaoFactoryBean<R extends JpaRepository<T, I>, T, I
extends Serializable>
extends JpaRepositoryFactoryBean<R, T, I> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(final
EntityManager entityManager) {
// dans JpaRepositoryFactoryBean, on ne fait que renvoyer un
JpaRepositoryFactory
return new DaoCommunAuxAutresDaoFactory<T, I>(entityManager);
}
…
2013-11-15
Spring Data - 20131114 - sdjpabase
35
36. Spring Data JPA
⦿Ajouter une méthode personnalisée pour tous les DAO
⦿Un FactoryBean devra être créé (2) :
…
private static class DaoCommunAuxAutresDaoFactory<T, I extends Serializable> extends
JpaRepositoryFactory {
private EntityManager entityManager;
public DaoCommunAuxAutresDaoFactory(final EntityManager entityManager) {
super(entityManager);
this.entityManager = entityManager;
}
@Override
@SuppressWarnings("unchecked")
protected Object getTargetRepository(final RepositoryMetadata metadata) {
// dans JpaRepositoryFactory, on renvoyait un SimpleJpaRepository
return new DaoCommunAuxAutresDaoImpl<T, I>((Class<T>) metadata.getDomainType(),
this.entityManager);
}
@Override
protected Class<?> getRepositoryBaseClass(final RepositoryMetadata metadata) {
/* On peut ignorer metadata qui sert à JpaRepositoryFactory */
return DaoCommunAuxAutresDao.class;
// dans JpaRepositoryFactory, on renvoyait soit un SimpleJpaRepository.class soit
un QueryDslJpaRepository.class
}}}
2013-11-15
Spring Data - 20131114 - sdjpabase
36
37. Spring Data JPA
⦿
Ajouter une méthode personnalisée
pour tous les DAO
⦿
L’interface qui devra être étendue
par tous les autres Repository :
@NoRepositoryBean
public interface DaoCommunAuxAutresDao<T, ID extends Serializable>
extends JpaRepository<T, ID>{
List<T>
uneMethodeDeRechercheCommuneATousLesDaoParLExemple(T exemple);
}
2013-11-15
Spring Data - 20131114 - sdjpabase
37
38. Spring Data JPA
⦿Ajouter une méthode personnalisée pour tous les DAO
⦿La classe implémentant l’interface commune à tous les
DAO :
public class DaoCommunAuxAutresDaoImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
implements DaoCommunAuxAutresDao<T, ID> {
private EntityManager entityManager;
public DaoCommunAuxAutresDaoImpl(final Class<T> domainClass, final EntityManager entityManager) {
super(domainClass, entityManager);
this.entityManager = entityManager;
}
@Override
public List<T> uneMethodeDeRechercheCommuneATousLesDaoParLExemple(final T exemple) {
Session session = (Session) this.entityManager.getDelegate();
Example hibernateExample = Example.create(exemple).ignoreCase().enableLike(MatchMode.ANYWHERE);
Criteria criteria = session.createCriteria(exemple.getClass()).add(hibernateExample);
return criteria.list();
}
}
2013-11-15
Spring Data - 20131114 - sdjpabase
38
39. Spring Data JPA
⦿
Ajouter une méthode personnalisée
pour tous les DAO
⦿ Repository quelconque :
Un
public interface AutrePersonneDao
extends DaoCommunAuxAutresDao<Personne, Long>{}
2013-11-15
Spring Data - 20131114 - sdjpabase
39
40. Spring Data JPA
⦿Ajouter une méthode personnalisée pour tous les DAO
⦿La classe de test :
@ContextConfiguration("classpath:applicationContext_daoCommun.xml")…
public class PersonneDaoPersonnaliseeBaseImplTest {
@Autowired
private AutrePersonneDao autrePersonneDao;
@Test
public void test() {
List<Personne> personnesTrouvees =
this.autrePersonneDao.uneMethodeDeRechercheCommuneATousLesDaoPa
rLExemple(this.personneSauvee);
}
}
2013-11-15
Spring Data - 20131114 - sdjpabase
40
41. Spring Data JPA (QueryDsl)
⦿ Parenthèse sur QueryDsl
⦿ QueryDsl est un outil ayant le même but que l'API Criteria (écriture des requêtes avec
vérification lors de la compilation), mais qui rend les requêtes plus parlantes
⦿ Criteria :
CriteriaQuery query = builder.createQuery(); Root<Person> men = query.from( Person.class );
Root<Person> women = query.from( Person.class );
Predicate menRestriction = builder.and(
builder.equal( men.get( Person_.gender ), Gender.MALE ),
builder.equal( men.get( Person_.relationshipStatus ),RelationshipStatus.SINGLE ));
Predicate womenRestriction = builder.and(
builder.equal( women.get( Person_.gender ), Gender.FEMALE ),
builder.equal( women.get( Person_.relationshipStatus ),RelationshipStatus.SINGLE ));
query.where( builder.and( menRestriction, womenRestriction ) );
⦿ QueryDsl :
JPAQuery query = new JPAQuery(em);
QPerson men = new QPerson("men");
QPerson women = new QPerson("women");
query.from(men, women).where(
men.gender.eq(Gender.MALE),
men.relationshipStatus.eq(RelationshipStatus.SINGLE),
women.gender.eq(Gender.FEMALE),
women.relationshipStatus.eq(RelationshipStatus.SINGLE));
2013-11-15
Spring Data - 20131114 - sdjpabase
41
42. Spring Data JPA
⦿Ajouter une méthode personnalisée à un
DAO
⦿Il faut une interface qui va contenir la
méthode personnalisée :
public interface PersonneDaoAvecMethodePersonnalisee {
public List<Personne>
uneMethodePersonnaliseeDeRechercheParNom(String nom);
}
2013-11-15
Spring Data - 20131114 - sdjpabase
42
43. Spring Data JPA
⦿Ajouter une méthode personnalisée à un DAO
⦿Il faut ensuite une classe implémentant l’interface
(nom = nom de l’interface + "Impl", configurable) :
public class PersonneDaoPersonnaliseeRepositoryImpl implements
PersonneDaoAvecMethodePersonnalisee {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Personne>
uneMethodePersonnaliseeDeRechercheParNom(String nom) {
return this.entityManager.createQuery("from Personne p where
p.nom = ?1").setParameter(1, nom).getResultList(); }
}
2013-11-15
Spring Data - 20131114 - sdjpabase
43
44. Spring Data JPA
⦿Ajouter une méthode personnalisée à un
DAO
⦿On termine en créant l’interface DAO qui sera
utilisée et à qui on va adjoindre la méthode
personnalisée :
public interface PersonneDaoPersonnaliseeRepository
extends CrudRepository<Personne, Long>,
PersonneDaoAvecMethodePersonnalisee {}
2013-11-15
Spring Data - 20131114 - sdjpabase
44
45. Spring Data JPA
⦿Ajouter une méthode personnalisée à un DAO
⦿La classe utilisatrice :
public class PersonneDaoPersonnaliseeRepositoryTest {
@Autowired
private PersonneDaoPersonnaliseeRepository
personneDaoPersonnaliseeRepository;
…
@Test
public void test() {
List<Personne> personneList =
this.personneDaoPersonnaliseeRepository.uneMethodePersonnaliseeDeRecherc
heParNom(this.personneSauvee.getNom());
}
}
2013-11-15
Spring Data - 20131114 - sdjpabase
45
46. Spring Data JPA
⦿Comment bénéficier de l'avantage de l'API
Criteria (vérification des requêtes à la
compilation) ?
⦿Utiliser des Specification
⦿Intégrer QueryDsl
⦿Inspiré des concepts du Domain Driven Design
⦿Plus d'informations ici :
http://spring.io/blog/2011/04/26/advancedspring-data-jpa-specifications-and-querydsl
2013-11-15
Spring Data - 20131114 - sdjpabase
46
47. Spring Data JPA
⦿Principe de l'utilisation des Specification
⦿Créer un objet qui implémente l'interface
Specification
⦿Le DAO étend en plus , JpaSpecificationExecutor
⦿Mettre le ou une combinaison de Specification
en paramètre des méthodes classiques de Spring
Data
2013-11-15
Spring Data - 20131114 - sdjpabase
47
48. Spring Data JPA
⦿ Exemple d'utilisation des Specification
1. On crée des objets Specification :
public CustomerSpecifications {
public static Specification<Customer> customerHasBirthday() {
return new Specification<Customer> {
public Predicate toPredicate(Root<T> root, CriteriaQuery query,
CriteriaBuilder cb) {
return cb.equal(root.get(Customer_.birthday), today);
}
};
}
public static Specification<Customer> isLongTermCustomer() {
return new Specification<Customer> {
public Predicate toPredicate(Root<T> root, CriteriaQuery query,
CriteriaBuilder cb) {
return cb.lessThan(root.get(Customer_.createdAt), new
LocalDate.minusYears(2));
}
};
}
}
2013-11-15
Spring Data - 20131114 - sdjpabase
48
49. Spring Data JPA
⦿Exemple d'utilisation des Specification
2. Notre DAO étend en plus
JpaSpecificationExecutor :
public interface CustomerRepository extends JpaRepository<Customer>,
JpaSpecificationExecutor {}
3. Le client peut ensuite les utiliser :
customerRepository.findAll(hasBirthday());
customerRepository.findAll(isLongTermCustomer());
customerRepository.findAll(where(customerHasBirthday()).and(isLongTermCu
stomer()));
2013-11-15
Spring Data - 20131114 - sdjpabase
49
50. Spring Data JPA
⦿Principe de l'utilisation de QueryDsl
⦿On inclut le plugin Maven de QueryDsl
⦿Le DAO étend en plus QueryDslPredicateExecutor
2013-11-15
Spring Data - 20131114 - sdjpabase
50
51. Spring Data JPA
⦿Exemple d'utilisation de QueryDsl
1. Notre DAO étend en plus
JpaSpecificationExecutor :
public interface CustomerRepository extends JpaRepository<Customer>,
QueryDslPredicateExecutor {
}
2. Le client peut ensuite les utiliser :
BooleanExpression customerHasBirthday = customer.birthday.eq(today);
BooleanExpression isLongTermCustomer =
customer.createdAt.lt(today.minusYears(2));
customerRepository.findAll(customerHasBirthday.and(isLongTermCustomer));
2013-11-15
Spring Data - 20131114 - sdjpabase
51
52. Spring Data JPA
⦿Les transactions :
⦿Toutes les méthodes pour récupérer des données
sont en readOnly=true. Les autres sont en
@Transactional(donc readOnly= false)
⦿@Transactional est configurable (timeout, readOnly,
…)
⦿Pour qu’une suite d’opérations soient dans la même
transaction, il suffit de mettre @Transactional dans
la méthode englobante. Il faudra ajouter
<tx:annotation-driven /> dans la configuration
2013-11-15
Spring Data - 20131114 - sdjpabase
52
53. Spring Data JPA
⦿L’intégration de Spring Data avec Spring MVC
⦿Offre quelques facilités :
⦿Récupération automatique des entités
⦿Pagination
2013-11-15
Spring Data – 20131114 - sdjpawebapp
53
54. Spring Data JPA
⦿ La récupération automatique des entités
⦿ Avant, on était obligé, à partir de l’identifiant, de récupérer les entités de la base
de données :
@Controller
@RequestMapping("/welcome/")
public class HelloController {
@RequestMapping("/voir/{id}")
public String voirVelo(@PathVariable("id") final Long id,
final Model modele) {
Velo veloTrouve = this.veloDao.findOne(id);
modele.addAttribute("message", "Modèle de vélo : " +
veloTrouve.getModele());
return "basique/fiche";
}
}
⦿ C’est très fastidieux
2013-11-15
Spring Data - 20131114 - sdjpawebapp
54
55. Spring Data JPA
⦿ Avec Spring Data, si on met directement en paramètre une
entité, celle-ci sera chargée automatiquement :
@Controller
@RequestMapping("/sdtouch/")
public class ControleurUnPeuMieuxAvecSD {
@RequestMapping("/voir/{id}")
public String
voirVelo(@PathVariable("id") final Velo veloTrouve,
final Model modele) {
modele.addAttribute("message",
"Modèle de vélo : " + veloTrouve.getModele());
return "sdtouch/fiche";
}
}
2013-11-15
Spring Data - 20131114 - sdjpawebapp
55
56. Spring Data JPA
⦿ Pour cela, il faut modifier un peu le dispatcherServletservlet.xml pour y ajouter un convertisseur :
<mvc:annotation-driven conversion-service="conversionService" />
<!-- Nécessaire pour la conversion String (id) vers une entité
récupéré par Spring Data (avec findOne()) -->
<bean class=
"org.springframework.data.repository.support.DomainClassConverter">
<!-- on va ajouter DomainClassConverter à la liste des
converters de conversionService -->
<constructor-arg ref="conversionService" />
</bean>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean"
/>
2013-11-15
Spring Data - 20131114 - sdjpawebapp
56
57. Spring Data JPA
⦿Pour la pagination, il faut récupérer les
paramètres de la requête HTTP pour récupérer
la page à afficher et la taille de la page :
@RequestMapping(value="/{page}/{pageSize}", method =
RequestMethod.GET)
public String printWelcome(final Model modele,
@PathVariable("page") final int page,
@PathVariable("pageSize") final int pageSize) {
Pageable pageable = new PageRequest(page, pageSize);
Page<Velo> resultat = this.veloDao.findAll(pageable);
return "basique/hello";
}
2013-11-15
Spring Data - 20131114 - sdjpawebapp
57
58. Spring Data JPA
⦿Spring Data améliore un peu la chose :
@RequestMapping(method = RequestMethod.GET)
public String printWelcome(final Model modele,
@PageableDefaults(pageNumber = 0, value = 2)final Pageable
pageable) {
final Page<Velo> resultatRecherche =
this.veloDao.findAll(pageable);
modele.addAttribute("velosTrouves",
resultatRecherche.getContent());
modele.addAttribute("pagination", resultatRecherche);
return "sdtouch/hello";
}
2013-11-15
Spring Data - 20131114 - sdjpawebapp
58
59. Spring Data JPA
⦿Comment s’opère la magie de Spring Data
(attention, spoiler) ?
2013-11-15
Spring Data – 20131114 - proxylab
59
60. Spring Data JPA
⦿Comment s’opère la magie de Spring Data ?
⦿Chargement des requêtes au chargement :
⦿Scanne les paquetages mentionnés dans l’applicationContext.xml
⦿Quand Spring trouve un repository, JpaRepositoryFactory va
créer un SimpleJpaRepository qui implémente JpaRepository
⦿Il met ensuite cet objet dans un Proxy
⦿Juste avant, il va associer à ce proxy un intercepteur de méthode
qui permet la résolution des requêtes personnalisées, nommées,
avec @Query, etc. Donc à ce stade, les requêtes sont résolues et
en cache
⦿Appel des méthodes des interfaces
⦿Quand une de ces méthodes est appelée, c’est en réalité le proxy
qui est appelé
⦿Celui-ci va appeler la méthode correspondante de l’objet
SimpleJpaRepository qu’on lui a donné au chargement
2013-11-15
Spring Data - 20131114 - proxylab
60
61. Spring Data JPA
⦿Comment s’opère la magie de Spring Data ?
Exemple.
⦿"Spring" :
public void injecteDansClient(final Client client) {
UnDao dao = (UnDao)
Proxy.newProxyInstance(Thread.currentThread().
getContextClassLoader(),
new Class[] { UnDao.class },
new ProxyInjecte());
client.setDao(dao);
}
2013-11-15
Spring Data - 20131114 - proxylab
61
62. Spring Data JPA
⦿Comment s’opère la magie de Spring Data ? Exemple.
⦿L'InvocationHandler :
class ProxyInjecte implements InvocationHandler {
private ClasseNonAppeleeParClient classeNonAppeleeParClient =
new ClasseNonAppeleeParClient();
public Object invoke(final Object proxy,
final Method method,
final Object[] args)
throws Throwable {
if (method.getName().equals("bambiFaitDodo")) {
this.classeNonAppeleeParClient.bambiFaitDodo();
} else if (method.getName().equals("atchoum")) {
this.classeNonAppeleeParClient.atchoum();
}
return null;
}
}
2013-11-15
Spring Data - 20131114 - proxylab
62
65. Spring Data Neo4j
⦿Neo4j : une base de données orientée graphe
⦿Cas d'utilisation typique : les réseaux sociaux
⦿Spring Data Neo4j apporte un niveau
d’abstraction supplémentaire à la
manipulation des graphes
2013-11-15
Spring Data - 20131114
65
66. Spring Data Neo4j
⦿ Neo4j quelques commandes de base
⦿ Démarrage d’une base Neo4j en mémoire :
public class Neo4jMain {
private final static String DB_PATH = "bdd_neo4j";
public static void main(String[] args) {
GraphDatabaseService graphDb =
new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
registerShutdownHook(graphDb);
}
private static void registerShutdownHook(final GraphDatabaseService graphDb) {
/* Pour que Neo4j s'arrête correctement, même en cas de Ctrl-C */
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
graphDb.shutdown();
}
} );
}}
2013-11-15
Spring Data – 20131114 - neo4jbasique
66
67. Spring Data Neo4j
⦿ Neo4j quelques commandes de base
⦿ Pour créer le graphe, qu’avec des noeuds :
Transaction tx = this.graphDb.beginTx();
try {
this.acteur = this.graphDb.createNode();
this.acteur.setProperty("nom", "Diesel");
this.acteur.setProperty("prenom", "Vin");
Node noeudFilm = this.graphDb.createNode();
noeudFilm.setProperty(Film.TITRE, "Rapides et dangereux");
this.acteur.createRelationshipTo(noeudFilm, JOUE_DANS);
noeudFilm = this.graphDb.createNode();// on utilise les noeuds
noeudFilm.setProperty(Film.TITRE, "Trop rapide et trop pas content");
this.acteur.createRelationshipTo(noeudFilm, JOUE_DANS);
tx.success();
} finally {
tx.finish();
}
2013-11-15
Spring Data – 20131114 - neo4jbasique
67
68. Spring Data Neo4j
⦿Neo4j quelques commandes de base
⦿Pour créer le graphe, en essayant d’utiliser des beans :
Transaction tx = this.graphDb.beginTx();
try {…
Film film = new Film(this.graphDb.createNode());
film.setTitre("Il faut sauver le soldat Ryan");
this.acteur.createRelationshipTo(film.getNoeud(),
JOUE_DANS);
tx.success();
} finally {
tx.finish();
}
2013-11-15
Spring Data – 20131114 - neo4jbasique
68
69. Spring Data Neo4j
⦿ Neo4j quelques commandes de base
⦿ Et dans le bean Film, on a :
public class Film {
public static final String TITRE = "TITRE";
private Node noeud;
public Film(Node noeud) { this.noeud = noeud; }
public Node getNoeud() { return this.noeud; }
public String getTitre() {
return (String) this.noeud.getProperty(TITRE);
}
public void setTitre(String nom) { this.noeud.setProperty(TITRE,
nom); }
}
⦿ La relation doit étendre RelationshipType :
public enum JoueDansRelationEnum implements RelationshipType {
JOUE_DANS;
}
2013-11-15
Spring Data – 20131114 - neo4jbasique
69
70. Spring Data Neo4j
⦿ Neo4j quelques commandes de base
⦿ Pour afficher le contenu du graphe, on peut utiliser un « Traverser » :
public void afficheGraphe() {
Traverser traverseurDeFilms = getTraverseursFilms();
for (Path path : traverseurDeFilms) {
if (path.length() == 0) {
System.out.println(path.endNode().getProperty("nom") +
" a joué dans les films suivants :");
} else {
System.out.println(path.endNode().getProperty(Film.TITRE));
}
}}
private Traverser getTraverseursFilms() {
TraversalDescription td =
Traversal.description().
breadthFirst().
relationships(JOUE_DANS).
evaluator(Evaluators.all());
return td.traverse(this.acteur);
}
2013-11-15
Spring Data – 20131114 - neo4jbasique
70
71. Spring Data Neo4j
⦿ Neo4j quelques commandes de base
⦿ Neo4j a son langage de « requêtage », le Cypher :
public void exempleCypher() {
String requete = "start n=node("+this.acteur.getId()+") " +
"match n-[:JOUE_DANS]->films " +
"where films." + Film.TITRE + " =~ 'Trop.*' " +
"return n, n.nom, n.prenom, films." + Film.TITRE;
ExecutionResult result = this.engine.execute(requete);
String rows = "";
for ( Map<String, Object> row : result) {
for ( Entry<String, Object> column : row.entrySet() ) {
rows += column.getKey() + ": " + column.getValue() + "; ";
}
rows += "n";
}
System.out.println(rows);
}
⦿ Affiche : n: Node[13]; n.nom: Diesel; films.TITRE: Trop rapide et trop pas
content; n.prenom: Vin;
2013-11-15
Spring Data – 20131114 - neo4jbasique
71
72. Spring Data Neo4j
⦿Ce qu’apporte Spring Data Neo4j
⦿Les nœuds deviennent des beans Java classiques.
Pareil pour les relations
⦿Les opérations de base peuvent se faire à partir
des interfaces
⦿Une bonne partie des opérations valables pour
JPA sont valables pour Neo4j
2013-11-15
Spring Data – 20131114 - sdneo4jbase
72
73. Spring Data Neo4j
⦿S'inclut avec une dépendance Maven :
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j-aspects</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
2013-11-15
Spring Data – 20131114 - sdneo4jbase
73
74. Spring Data Neo4j
⦿Un exemple de nœud Spring Data Neo4j :
@NodeEntity
public class Acteur {
@GraphId
private Long idNoeud;
@Indexed(indexType =
IndexType.FULLTEXT,
indexName="nom")
private String nom;
private String prenom;
public void aJoueDans(Film film) {
this.films.add(film);
}
@RelatedTo(direction=Direction.
BOTH, type="aJoueDans")
private Set<Film> films;
@RelatedToVia
private Set<Realisation>
realisations;
// getters et setters classiques
2013-11-15
public Realisation aRealise(Film
film) {
Realisation realisation =
new Realisation();
realisation.setActeur(this);
realisation.setFilm(film);
realisations.add(realisation);
return realisation;
}
Spring Data – 20131114 - sdneo4jbase
74
75. Spring Data Neo4j
⦿Les relations deviennent aussi des beans Java
classiques :
@RelationshipEntity(type="aRealise")
public class Realisation {
@GraphId
private Long id;
private Calendar dateRealisation;
@StartNode
private Acteur acteur;
@EndNode
private Film film;
// getters et setters classiques
2013-11-15
Spring Data – 20131114 - sdneo4jbase
75
76. Spring Data Neo4j
⦿Les DAO sont toujours aussi minimalistes :
public interface ActeurDao extends GraphRepository<Acteur> {
@Query("start acteur=node({0}) " +
"match acteur-[:aRealise]->film " +
"return film")
Iterable<Film> recupereMoiTousLesFilmsRealisesPar(Acteur
acteur);
}
2013-11-15
Spring Data – 20131114 - sdneo4jbase
76
77. Spring Data Neo4j
⦿L'utilisation s'en trouve simplifiée :
public void setup() {
this.acteurDao.deleteAll();
Acteur vinDiesel = new Acteur();
vinDiesel.setNom("Diesel");
vinDiesel.setPrenom("Vin");
vinDiesel.aJoueDans(leFilm("Strays"));
vinDiesel.aJoueDans(leFilm("Il faut sauver le soldat Ryan"));
vinDiesel.aJoueDans(leFilm("Les Initiés"));
final Film multiFacial = leFilm("Multi-Facial");
this.filmDao.save(multiFacial);
vinDiesel.aRealise(multiFacial).en(1994);
this.acteurDao.save(vinDiesel);
}
2013-11-15
Spring Data – 20131114 - sdneo4jbase
77
78. Spring Data Neo4j
⦿D'autres exemples d'utilisation :
EndResult<Film> filmsTrouves = this.filmDao.findAll();
EndResult<Film> filmsTrouves =
this.filmDao.findAllByPropertyValue("titre", "Strays");
Film filmTrouve = this.filmDao.findByPropertyValue("titre", "Les Initiés");
Iterable<Film> filmsTrouves = this.filmDao.findByTitreContaining("Il");
Acteur vinDiesel = this.acteurDao.findOne(identifiantVinDiesel);
final Iterable<Film> filmsTrouves =
this.acteurDao.recupereMoiTousLesFilmsRealisesPar(vinDiesel);
2013-11-15
Spring Data – 20131114 - sdneo4jbase
78
79. Spring Data Neo4j
⦿On peut aussi utiliser les Traversers :
final Acteur vinDiesel =
this.acteurDao.findOne(this.identifiantVinDiesel);
TraversalDescription traversalDescription =
Traversal.description().
breadthFirst().
evaluator(Evaluators.atDepth(1));
final Iterable<Film> filmsJouesParVinDiesel =
this.filmDao.findAllByTraversal(vinDiesel,
traversalDescription);
2013-11-15
Spring Data – 20131114 - sdneo4jbase
79
80. Spring Data Neo4j
⦿L'applicationContext.xml :
<neo4j:repositories
base-package="fr.soat.springdata.neo4j.sdneo4jbase.dao" />
<neo4j:config storeDirectory="data/bdd_neo4j" />
2013-11-15
Spring Data – 20131114 - sdneo4jbase
80
81. Spring Data Neo4j
⦿La hiérarchie des interfaces Spring Data :
findAllByTraver
TraversalRepository sal
PagingAndSortingRepository
CRUDRepository
save(U),
findOne(Long),
findAll(),…
IndexRepository
findAllByQuery
findAllByRange
…
GraphRepository
2013-11-15
Spring Data – 20131114 - sdneo4jbase
81
82. Spring Data JPA
Spring Data Commons
Repository
CrudRepository
PagingAndSortingRepository
JpaRepository
Pas de méthode
save(S), findOne(ID), exists(), findAll(), deleteAll(), …
findAll(Sort), findAll(Pageable)
flush(), saveAndFlush(T), deleteInBatch(Iterable<T>), …
Spring Data JPA
2013-11-15
Spring Data - 20131114 - sdjpabase
82
83. Spring Data Neo4j
⦿D'autres interfaces sont disponibles, comme
CypherDslRepository pour exécuter du
CypherDsl, SpatialRepository pour les
requêtes spatiales
2013-11-15
Spring Data – 20131114 - sdneo4jbase
83
86. Spring Data REST
⦿Spring Data REST simplifie l’exposition des
services REST
⦿Pour offrir un service REST, il suffit :
⦿De dire qu’on utilise Spring Data REST pour une
source de données particulière (JPA, Neo4j,
MongoDB, etc.)
⦿D’étendre une des interfaces de Spring Data
⦿De dire où se situent ces interfaces d’export
⦿De… non, c’est tout
2013-11-15
Spring Data – 20131114 - sdrestws
86
87. Spring Data REST
Spring Data REST WebMVC
Spring MVC
Spring Data JPA
Spring Data
Neo4j
Spring Data
MongoDB
Spring Data Commons
2013-11-15
Spring Data – 20131114 - sdjpabase
87
88. Spring Data REST
⦿ Dans le pom.xml :
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
… et les dépendances vers H2 et Hibernate
2013-11-15
Spring Data - 20131114 - sdrestws
88
89. Spring Data REST
⦿Un brin de folie, le DAO a une annotation à
lui :
@RestResource(path="chanson") //pour personnaliser un peu la façon dont le
service web est appelé
public interface ChansonDao extends CrudRepository<Chanson, Long> {
}
⦿Le bean Chanson :
@Entity
public class Chanson {
@Id
private Long id;
private String titre;…}
2013-11-15
Spring Data - 20131114 - sdrestws
89
90. Spring Data REST
⦿Utilisation :
mvn clean install jetty:run lance Jetty et le fait écouter sur le port 8080
curl -H "Content-Type: application/json" -d '{"titre":"Get
Lucky","id":"2"}' http://localhost:8080/chanson
curl -v http://localhost:8080/chanson/2
Renvoie :
{
"links" : [ {
"rel" : "self";
"href" : "http://localhost:8080/chanson/2"
} ],
"titre" : "Get Lucky"
}
2013-11-15
Spring Data - 20131114 - sdrestws
90
94. Spring Data MongoDb
⦿ Aperçu de Spring Data MongoDB
⦿ On a un bean :
@Document(collection = "menu") // annotations pas nécessaires
public class MenuItem {
@Id private String id;
@Field("itemName") @Indexed private String name;
}
⦿ Le répository associé
public interface MenuItemRepository
extends CrudRepository<MenuItem, String> {
public List<MenuItem> findByIngredientsNameIn(String... name);
}
⦿ Un exemple d'utilisation
menuItemRepository.save(eggFriedRice());
List<MenuItem> peanutItems
menuItemRepository.findByIngredientsNameIn("Peanuts");
2013-11-15
Spring Data - 20131114
94
95. Spring Data - conclusion
⦿Pour aller plus loin :
⦿Le site de Spring Data :
http://projects.spring.io/spring-data/
⦿Le livre sur Spring Data :
⦿http://shop.oreilly.com/product/0636920024767.do
⦿Et ses exemples : https://github.com/springprojects/spring-data-book
⦿Le livre sur Spring Data Neo4j : Good Relationships
The Spring Data Neo4j Guide Book
⦿Mes exemples :
⦿https://github.com/xeter/soirees3t
2013-11-15
Spring Data - 20131114
95