Le cours Spring-Boot Crash | Cosmin Ionita | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Intro

      1:03

    • 2.

      Pourquoi SpringBoot ?

      2:17

    • 3.

      Créez votre première application Spring-Boot

      10:38

    • 4.

      Comment pouvons-nous utiliser les demandes POST ?

      10:55

    • 5.

      Mettre en œuvre des réponses standard

      6:18

    • 6.

      Créer des services dans Spring-Boot

      14:08

    • 7.

      Ajouter des configurations dans application.yaml

      6:01

    • 8.

      Appeler des services externes via HTTP

      9:09

    • 9.

      Configuration de MySQL avec Docker

      9:33

    • 10.

      Configurer notre application Spring-Boot pour fonctionner avec MySQL

      15:19

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

261

apprenants

1

projets

À propos de ce cours

Intro

Ce cours est tout ce dont vous avez besoin pour commencer avec le cadre Spring-Boot en Java, qui est le cadre Web le plus populaire sur JVM, utilisé par de nombreuses entreprises de grande technologie.

Java est un langage vraiment génial et fournit un certain nombre de fonctionnalités disponibles dans la boîte, mais si vous souhaitez créer une API REST en Java pur, elle pourrait ne pas être aussi simple.

Pour cette raison, les développeurs ont créé des cadres qui vous permettent de construire des API rapidement, avec des pratiques exemplaires en matière de conception du code et de performance et efficacité, et Spring-Boot est un tel cadre.

Pourquoi avez-vous besoin pour apprendre le cadre Spring-Boot ?

Spring-Boot est si populaire en raison des éléments suivants :

  • Il vous permet de créer des applications de qualité de production très rapidement
  • Il favorise un code base bien conçu
  • Il s'intègre avec des systèmes externes de manière transparente
  • Il dispose d'une grande communauté open source qui l'améliore constamment
  • Et bien d'autres raisons

En disposant de Spring-Boot dans votre ensemble de compétences en tant que développeur Java, vous pourrez :

  • Soyez plus compétitif sur le marché du travail
  • Soyez plus productif car vous allez lire et écrire du code plus rapidement (et mieux) en reconnaissant et en appliquant des modèles de conception bien établis intégrés dans Spring-Boot
  • Poursuivre davantage de possibilités techniques puisque de nombreux projets open source utilisent Spring-Boot

Dans l'ensemble, ce cadre vous permettra de progresser dans votre carrière en génie logiciel et l'apprendre dès que possible est probablement l'un des meilleurs pas stratégiques que vous pouvez réaliser pour développer votre expertise technique.

Ce que vous allez apprendre dans ce cours

Ce cours dure environ 1 heure, mais sachez qu'il est rempli d'informations. En un mot, nous allons créer une API REST simple qui interagit avec une base de données MySQL pour stocker des données des utilisateurs et également avec une API HTTP externe, pour saisir quelques données externes.

Une liste non exhaustive des choses que vous allez apprendre dans ce cours est les suivantes :

  • Qu'est-ce que Spring-Boot et comment elle se compare à une application Java en ligne de commande traditionnelle
  • Comment importer un cadre Spring-Boot dans un projet IntelliJ Idea vide
  • Comment pouvez-vous trouver les bonnes dépendances de printemps sur le web
  • Comment créer un contrôleur REST et recevoir quelques données via HTTP
  • Comment configurer votre contrôleur REST pour renvoyer des données et suivre les meilleures pratiques
  • Comment créer des services dans Spring-Boot
  • Comment utiliser le mécanisme Spring-Configuration
  • Qu'est-ce que l'injection de dépendance et comment cela fonctionne
  • Comment vous pouvez appeler une API externe via HTTP à partir de votre application en utilisant un client HTTP
  • Comment configurer la désérialisation Jackson pour n'extraire que les données dont vous avez besoin
  • Comment vous pouvez créer et configurer une base de données MySQL à l'aide de Docker
  • Comment configurer une application Spring-Boot pour vous connecter et interagir avec la base de données MySQL
  • Comment pouvez-vous utiliser des transactions dans Spring-Boot pour assurer des opérations atomiques sur la base de données

Ce cours est conçu pour vous guider dans ce cadre en mettant en évidence comment construire une application simple qui se connecte à 2 autres systèmes, d'un point de vue bout en bout. C'est très pratique, car c'est le meilleur moyen d'apprendre n'importe quelle nouvelle technologie, en jouant avec elle autant que possible

Pour fixer les bonnes attentes : ce cours n'est pas un cours Spring-Boot complet, il ne couvre pas toutes les configurations et les dépendances possibles que Spring-Boot fournit. Il s'agit plutôt d'un cours hautement axé sur la création d'une application similaire à un microservice. L'objectif principal est de vous donner un aperçu de ce que Spring-Boot ressemble comme un cadre Web et de ce que vous avez vécu pour le développeur.

Les conditions nécessaires pour ce cours

Ce cours s'adresse aux développeurs Java débutants, aux étudiants en informatique et en ingénierie, aux développeurs existants qui souhaitent apprendre quelque chose de nouveau et bien sûr, à toute personne qui souhaite apprendre Spring-Boot.

Les seules conditions préalables à ce cours sont les suivantes :

  • Edition communauté IntellIJ IDEA (gratuit)
  • Des connaissances de base en Java (cours, interfaces, génériques)
  • La volonté d'apprendre :-)

Dans les 2 derniers cours, je vais utiliser un terminal et un Docker. Si vous en êtes familiaris, il vous sera plus facile de suivre ce cours, mais ils ne sont pas nécessaires, car je vous explique une commande que je vais exécuter pas-à-pas.

Merci d'être ici et nous allons dans le premier cours !

Rencontrez votre enseignant·e

Teacher Profile Image

Cosmin Ionita

Senior Software Engineer

Enseignant·e

I'm Cosmin, a Software Engineer with over 10 years of experience in developing enterprise-grade applications, based in Bucharest, Romania.

I am a self-learner, truly passioned about the technology, focused on gaining new skills, building great professional relationships and deeply understanding the underlying concepts behind the technologies I interact with.

 

My expertise revolves around JVM-based applications and surrounding systems/techniques for container management, deployment workflows, monitoring and alerting, performance optimization, code quality, resource efficiency, and many others.

 

I strongly believe that continuous learning is the only way to stay relevant in the Software Engineering industry, and to me, teaching is a... Voir le profil complet

Level: Beginner

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Intro: Bonjour à tous et bienvenue au cours intensif Spring Boot. La meilleure ressource en ligne dont vous avez besoin pour apprendre Spring Boot à partir de zéro et devenir un meilleur ingénieur logiciel. Le framework Springboard est utilisé par de nombreuses grandes entreprises technologiques pour créer leurs architectures de microservices et leurs systèmes dorsaux à grande échelle, car il vous aide à créer une production hautement performante. évaluez les applications tout en maintenant l'évolutivité de votre base de code. fait d'avoir intégré nos compétences vous permettra de devenir plus compétitif le marché du travail et constitue certainement une technologie que vous devez sur le marché du travail et constitue certainement une technologie que vous devez maîtriser pour devenir un logiciel principal senior. ingénieur. Dans ce cours, nous allons créer à partir de zéro une API REST à l'aide Spring Boot qui communique avec une API externe via HTTP, mais également avec une base de données MySQL locale pour en stocker données utilisateur. L'objectif de ce cours est de vous montrer comment Spring Boot fonctionne dans une application de bout en bout dotée de fonctionnalités similaires à celles d'un microservice. Et j'espère que cela vous donnera un bon départ pour devenir un printemps avec un maître. La seule condition requise pour ce cours est d'avoir installé une idée intelligente, des connaissances de base en Java et, bien sûr, un fort désir d'apprendre de nouvelles technologies. Passons donc la première leçon de ce cours. 2. Pourquoi SpringBoot ?: Bonjour à tous, bon retour. Donc, avant de plonger dans le code proprement dit, prenons un moment pour comprendre pourquoi nous devons apprendre le framework Spring Boot. Nous sommes ici sur le site officiel de Spring Width. Et si nous cliquons sur l'aperçu, nous pouvons voir un certain nombre d'avantages de ce cadre qui sont en fait validés par l'industrie. Je veux dire, ils sont ajoutés ici même sur le site Web. Mais la popularité de ce framework en dit long sur la savoir si ces avantages sont réellement vrais ou non, n'est-ce pas ? Alors tout d'abord, à propos de la popularité, non ? Mais si elle est si populaire, c' est parce qu' elle est très flexible et qu'elle vous permet de créer des applications de cadence de production très rapidement. Nous verrons plus loin dans ce cours que Spring with est vraiment facile à configurer, que ce soit à l'aide d'annotations ou de fichiers de configuration. Et il est également important de mentionner le paysage des applications dans lesquelles Spring Boot peut être utilisé. Nous pouvons l'utiliser pour créer des microservices, ce qui est un peu la nouvelle tendance actuelle. Pratiquement toutes les grandes entreprises disposent cette architecture de microservices dans une partie de leur infrastructure. Et Spring Boot offre en fait un support complet pour ce Mosley. Si vous utilisez Spring Cloud et les fonctionnalités Cloud que Spring Cloud offre réellement, euh, mais en dehors de cela, vous pouvez également créer des applications réactives et des applications basées sur les événements. Il s'intègre donc à presque toutes les nouveautés qui se produisent sur le marché. En d'autres termes, si vous savez comment fonctionne Spring, vous avez un avantage dans le aujourd'hui un avantage dans le monde du génie logiciel. Il existe donc un certain nombre de clips et de documentation sur Internet que vous pouvez suivre si vous voulez avoir un aperçu, Palm Springs fonctionne réellement, de nombreuses personnes l'utilisent réellement. Il y a donc beaucoup de documentation sur Internet. Et le rôle principal de ce cours est de vous permettre d'utiliser le tremplin très rapidement. Nous n'allons donc pas entrer dans tous les détails du tremplin. Nous allons juste commencer tout de suite et passer aux principales capacités de Springfield, n'est-ce pas ? Je suppose que vous ne pouvez pas avoir de programmation orientée objet et comment les choses fonctionnent dans cet espace. Je travaille dans les classes, les interfaces, les méthodes, etc. Donc des connaissances de base en Java. Et puis nous allons poursuivre sur cette lancée avec les fonctionnalités du framework Spring Boot. 3. Créez votre première application Spring-Boot: Assez de bavardages. Voyons un peu de code, non ? Si vous souhaitez créer votre première application Spring Boot, nous avons deux options. La première consiste à utiliser ce site Web Spring Initializer, auquel vous pouvez accéder au démarrage Spring point io. Et ce site Web vous permet de créer une application Spring Boot préconfigurée. Il vous suffit de cliquer, de sélectionner votre projet, votre langue, votre version Spring Boot, version Spring Boot, et de compléter le nom de votre projet, votre groupe d'artefacts et d'autres informations de ce type, y compris la version Java. Et lorsque vous cliquez sur Générer, vous verrez que le navigateur téléchargera une archive contenant le projet dans un projet intelligent contenant une application Hello World simple avec tremplin préconfiguré. C'est bien sûr la voie la plus facile, mais nous n'allons pas suivre cette voie. Nous allons plutôt partir d' un projet d'idée propre et intelligent et nous allons ajouter ce qui est nécessaire en termes de dépendances printanières pour voir comment cela fonctionne réellement. J'ai donc ici l'idée intelligente de Community Edition. Je vais cliquer sur Nouveau projet. Je vais parler du cours Spring Boot. Je vais sélectionner Java comme meilleur système de langage tel que construit. Je vais utiliser Java 17. Et ici, je vais dire Java point, spring, spring point course. Je veux cliquer sur Créer et nous allons attendre que Gradle soit actualisé pour télécharger toutes les dépendances initiales. Et il s'agit de notre premier projet. Nous allons maintenant revenir sur le Web et rechercher Spring Boot Starter Web. Maven, Central. Central est bien entendu le référentiel principal pour les dépendances basées sur la JVM que nous allons rechercher. Cette dépendance s'appelle Spring Boot Starter Web. Il s'agit d' une sorte de dépendance mince qui inclut à peu près tout dont nous avons besoin pour créer une application Spring Boot très basique. Nous allons cliquer sur la dernière version et sélectionner Gradle. Et nous allons le copier directement notre fichier Gradle intégré, la section des dépendances. Je vais le coller ici, puis appuyer sur Rafraîchir davantage. Et puis nous pouvons voir qu'il a été téléchargé correctement. Maintenant, je vais revenir à la classe principale et ici au niveau de la classe et passer application annotée avec Spring Boot. Ces rotations proviennent, bien entendu, du framework Spring Boot identifiant le point d'entrée de notre application Spring Boot. Et dans le corps de la classe principale, nous allons dire Spring application point run. Et ici, nous allons fournir l'objet principal de la classe de points. C'est donc un, c' est l'identifiant de la classe principale où se trouve le ressort avec annotation. Ensuite, nous allons fournir les arguments fournis sur la méthode principale. Donc, ce que fait cette ligne, c'est de commencer, le framework lui-même est essentiellement une instruction de blocage. Ainsi, l'application, le processus, processus JVM ne se termineront pas tant que l'application ne sera pas supprimée ou tant qu'elle terminée d'une manière ou d'une autre, n'est-ce pas ? Toute application Spring, je veux dire, n'importe quel serveur Web devrait fonctionner longtemps car il doit accepter les connexions continues des clients HTTP. Ainsi, lorsque nous cliquons sur Exécuter, nous allons voir dans les journaux cette sortie. Vous pouvez donc voir ce bel art disant printemps ainsi que la version printanière. Et sur les journaux, nous pouvons voir que nous avons obtenu ici les journaux du serveur Web Tomcat. Nous pouvons voir le port sur lequel l'application s'exécute et nous pouvons voir qu'elle a démarré correctement. En d'autres termes, Tomcat est essentiellement un serveur Web fourni avec Spring Boot. Vous pouvez donc également l' installer indépendamment, non ? Il a été construit par la communauté Apache et il s'agit essentiellement d'un serveur Web classique, accepte simplement les connexions, suit le protocole HTTP et tout le reste. La principale raison pour laquelle il a été intégré au cadre, je crois, est qu' il est très léger. Il ne consomme donc pas trop de mémoire et trop, trop de ressources. Et c'est probablement la raison pour laquelle il a été choisi pour faire partie du tremplin Framework. Je pense que nous pouvons également le modifier si vous le souhaitez avec Apache, Caterer ou d'autres serveurs Web. C'est ainsi que cela fonctionne dans une version par défaut, non ? Bien, c'est ainsi que fonctionne réellement notre première application Spring Boot . Actuellement, l'application ne fait rien, elle accepte simplement les connexions sur le TDAH. Mais si nous allons dans notre navigateur et disons localhost, local, solicit, hôte local TDAH, et que nous cliquons simplement dessus. Nous pouvons voir que nous n'avons rien. Cette erreur provient en fait de Spring Boot ou de Tomcat, je crois, car l'entreprise a besoin de trouver des chemins pour mapper la demande et par défaut, Patty n'a rien vers lequel mapper. Donc, actuellement, notre application ne fait que s'exécuter et nous n'avons spécifié aucun type d'action à exécuter sur une interaction particulière, n'est-ce pas ? C'est donc l'État actuellement, non ? Nous avons juste une application qui ne fait rien. Comment dire à cette obligation qu'elle doit effectuer une action spécifique lorsque les clients interagissent avec elle d'une manière spécifique ? C'est pourquoi nous allons créer une classe appelée contrôleur, contrôleur de repos. Et nous allons placer cette classe dans un package dédié appelé contrôleurs, n'est-ce pas ? viens de créer un package, puis je vais appeler ce contrôleur utilisateur. Ainsi, lorsqu'il s'agit d' une application Spring Boot, un contrôleur est le premier point d'entrée d'une demande dans l'application. Ainsi, lorsque les clients font une demande qui doit atteindre l'application, elle touche généralement d'abord un contrôleur. Ensuite, en fonction de la logique définissant le contrôleur, la demande sera propagée dans d'autres composants, comme nous le verrons plus loin dans ce cours. Donc, pour avoir une idée du fonctionnement d'un contrôleur, créons ici une méthode appelée public void, en fait public string get user. Cette méthode est une méthode classique très simple. Il renvoie simplement quelque chose comme l'utilisateur John Doe renvoie simplement une chaîne. Et très important, cette méthode sera annotée avec get mapping suivi de getUser ici. Nous pouvons avoir n'importe quel type de chaîne qui devrait en fait commencer par une barre oblique car elle doit avoir une structure semblable à un chemin. Cette annotation permet donc de créer un chemin ou un itinéraire dans notre application. Ainsi, lorsqu'un client, qu'il s'agisse d'un navigateur ou d'un client HTTP appelle ce chemin. Cette méthode sera appelée directement dans notre application, non ? C'est donc ainsi que cela fonctionne réellement. Réexécutons maintenant notre application pour que ces modifications prennent effet. Et nous allons appuyer sur Entrée sur celui-ci, non ? Donc, comme vous pouvez le voir ici, nous avons retrouvé cette chaîne, n'est-ce pas ? Maintenant, si nous cliquons sur Inspecter pour voir la demande réelle, si nous cliquons sur So dans l' onglet Réseau et que nous appuyons sur Actualiser, nous pouvons voir que le navigateur a effectivement lancé cette requête HTTP get sur cette URL, localhost 80, 80 GetUser, le navigateur par défaut, lorsque vous actualisez une page, il émet cette requête get. En fait, cela fait, en fait, il fait initialement cette demande d'obtention. Ensuite, il peut télécharger du code JavaScript, qui est ensuite exécuté par le navigateur, qui peut ensuite autoriser d'autres requêtes, etc. Dans la pratique, c' est donc encore plus complexe. Mais dans ce cas d'utilisation très simple, le navigateur vient de lancer une requête get sur laquelle nous avons accédé à notre API, qui renvoie cet objet de chaîne. C'est ainsi que vous récupérez les données de notre API. Maintenant, si nous cliquons simplement ici, si nous cliquons ici sur la réponse, nous pouvons voir notre charge utile de chaîne. Et si nous cliquons ici pour revenir sur les en-têtes, nous pouvons voir que sur les en-têtes de réponse, nous avons également obtenu ces informations ici. Ces en-têtes ont en fait été ajoutés par le framework. Nous ne l'avons donc pas fait, nous n'avons rien fait pour que ces données apparaissent ici. Il s'agit des en-têtes de demande. Et à l'avenir, il ne s'agit que d'une saisie d' informations par valeur clé, n'est-ce pas ? Et c'est ce que le navigateur Chrome a effectivement ajouté à la demande de notre application. Maintenant, bien sûr, nous pouvons modifier ces en-têtes en utilisant les mécanismes Spring Boot. Mais il est très important de noter que leur structure, le nom, le nom clé des en-têtes et les valeurs sont en fait régulés par le protocole HTTP. Donc, le protocole HTTP, et d'ailleurs, HTTP est l' abréviation de Hypertext Transfer Protocol. L'hypertexte fait en fait référence au HTML, mais il s'agit plutôt d'un ancien nom, car vous pouvez transférer des données binaires via HTTP. Le HDP a donc un certain nombre de règles. Tout protocole comporte essentiellement un certain nombre de règles qui régissent un certain type d'action. Dans ce cas, le protocole HTTP régit la communication entre le client et le serveur. Vous pouvez donc voir pratiquement toutes sortes de détails sur la façon dont l'en-tête doit être transmis. Vos procurations fonctionnent réellement. En d'autres termes, si un client et le serveur respectent les mêmes règles, ils peuvent communiquer correctement en utilisant les règles du protocole HTTP, y compris la mise en cache. Mais le but de ce cours n'est pas d' approfondir le protocole HTTP car il est très, très complexe. Et de nombreux détails se trouvent dans ce sujet en particulier, peut-être pour un cours différent à l'avenir. Mais pour l'instant, nous allons nous limiter à ces utilisations très basiques de ce protocole. En résumé, lorsque vous envoyez une requête get à un serveur Web, vous lui demandez essentiellement des données. Lorsque vous effectuez une demande de publication, vous transmettez des données à ce serveur. Dans ce cas, nous définissons un bon mappage, ce qui signifie que nous demandons à l'API, le serveur Web, d'autoriser les requêtes GET sur ce chemin. Nous utilisons également le post-mapping, ce qui signifie que nous demandons au serveur Web de recevoir données de clients externes sur un chemin différent, par exemple arêtes. Et c'est ce que nous allons faire ensuite. Dans la prochaine conférence, nous allons continuer à développer ce contrôleur utilisateur afin d'explorer encore plus cette interaction avec les clients externes. 4. Comment pouvons-nous utiliser les demandes POST ?: Nous avons donc vu comment nous pouvons essentiellement récupérer certaines données à partir de notre API. Maintenant, apprenons et jouons avec ce mécanisme d'entrée et de sortie de Spring Boot, qui est le contrôleur et la configuration de mappage. très intéressant de tester avec un navigateur si le code HTML est renvoyé par votre application, car le navigateur affichera réellement le code HTML. Si nous disons quelque chose comme HTML fermé, puis que nous disons corps, bien sûr, ce n'est pas le cas. C' est juste à des fins de test, juste pour vous montrer que le navigateur affiche le code HTML, juste tous les textes ici. Donc, si nous l'exécutons à nouveau et rechargeons la page, nous pouvons voir que le texte est essentiellement affiché par le navigateur. En conséquence, nous renvoyons du code HTML, mais il est affiché automatiquement par le navigateur. Maintenant, lorsque vous avez un serveur Web, vous transférez habituellement des données dans un format tel que JSON ou Proto Buff. Et vous n'avez pas vraiment besoin de ce type d'interaction avec le navigateur, mais cela peut être utile si vous avez ce type d'utilisation, en renvoyant simplement du code HTML. Maintenant, au lieu du navigateur, nous allons utiliser un client HTTP dédié , appelé postmen. Il s'agit essentiellement d'un outil doté d'une interface utilisateur agréable qui nous permet d'interagir ou tester une API avec différents types de requêtes, types et différents types de charges utiles qui peuvent configurez de manière très simple. Ainsi, lorsque vous concevez un service Web, jouez généralement avec ce type d'outil pour voir comment il fonctionne et pour tester différentes choses. Donc, exactement la même demande que nous avons faite depuis le navigateur, nous pouvons faire depuis Postman en disant localhost 80, 80 suivi de l'utilisateur Git. Et si vous cliquez sur Envoyer, vous pouvez voir que le code HTML exécuté, renvoyé, n'est-ce pas ? Vous pouvez également formater et répondre de différentes manières. Disons maintenant que nous voulons renvoyer une chaîne depuis notre API. Cette chaîne devrait en fait être la représentation JSON de notre objet utilisateur. Définissons donc d'abord un modèle dans notre application. Je vais créer un nouveau package appelé model. Ici, je vais parler de modèle utilisateur. Il s'agit de la classe réservée à notre utilisateur. Et à l'intérieur, nous allons avoir des chaînes privées, FirstName et LastName. Et disons que nous devons également fournir aux entiers une appartenance par d, non ? Qu'il s'agisse d'un utilisateur Premium Platinum ou d'un serveur unique de niveau, dans notre application, juste pour tester les choses. Nous allons donc ajouter, tout d' abord, un constructeur. Nous allons également ajouter des getters et des setters pour tous les champs, non ? Une idée intelligente nous aide à le faire vraiment très bien. La seule manette que nous allons renvoyer à un modèle utilisateur, non ? Nous devons importer cette classe. Et ici, quand nous y reviendrons, nous devons dire New User model de John Doe et 1234, d'accord ? Bien sûr, nous jouons avec des classes dans le monde réel, nous jouons avec des modèles d'objets réels. C'est pourquoi nous devons également expérimenter cela. Donc, lorsque je clique sur envoyer la réponse, nous obtenons ce JSON. Donc, comme vous pouvez le voir, le framework a en fait converti notre objet en objet adjacent, gros, notre objet, un tube modèle sérialisé dans un format adjacent, n'est-ce pas ? Et cela a été fait automatiquement par le Spring Would Framework. Maintenant, si nous revenons au contrôleur, nous pouvons avoir besoin de renvoyer différents utilisateurs sur la base d'un identifiant, n'est-ce pas ? Donc, par exemple, disons que nous avons ici une carte, une carte privée contenant une chaîne de caractères vers UserModel, n'est-ce pas ? Appelez cette carte utilisateur new HashMap. Très bien, et supposons que nous ajoutions un petit contrôleur ici, un contrôleur utilisateur public. Et sur cette carte, nous avons deux utilisateurs. Disons, disons que sur la carte utilisateur que nous ajoutons, nous mettons en premier lieu l' utilisateur John, qui possède ceci, ce modèle ici. Ensuite, nous avons également mis l'utilisateur Jane, par exemple et voici Jane Doe avec des membres différents de d. Donc, en gros, nous avons ces deux utilisateurs sur cette carte. Et lorsque nous voulons obtenir l'utilisateur à partir de notre API, nous voulons l'obtenir en fonction de son nom, n'est-ce pas ? Cela signifie que le nom doit être fourni sur la demande. Le client doit donc ajouter ici un nom qui peut être une variable. Et celui-ci devrait s'appeler nom d'utilisateur, non ? C'est ainsi que vous indiquez sur nous, sur un chemin, le fait que vous souhaitez en extraire une variable. Donc, ici même sur le nom d'utilisateur, nous devons également l' ajouter aux paramètres de cette méthode en utilisant l'annotation de la variable path. Ici, nous devons spécifier le type de la variable et le même nom exact que celui que nous avons ajouté sur le chemin, n'est-ce pas ? Ainsi, lorsque vous faites une demande, si vous dites getUser John directement depuis le navigateur ou depuis Postman, la valeur John sera propagée sur cette variable de nom d'utilisateur. Et nous pouvons l'utiliser comme n' importe quelle autre variable. Donc, dans ce cas, nous pouvons dire que la carte de l'utilisateur reçoit le nom d'utilisateur, non ? Alors réexécutons-le. Et en fait, je vais également appuyer sur Debug et mettre un point d'arrêt ici pour m'assurer que cette variable est correctement renseignée. L'application a donc commencé. Je vais revenir sur Postman, dire getUser point John et appuyer sur Send and rice Nous pouvons dire que la variable username contient le John valide, et elle ira simplement sur la carte et renverra le objet, non ? Je vais donc cliquer sur Suivant et vice versa. Nous pouvons constater que nous obtenons la même chose. Maintenant, si nous utilisons la chaîne, nous pouvons voir les variables pour jouer correctement et appuyer sur F9, et nous pouvons voir que nous obtenons les autres objets. C'est donc ainsi que vous fournissez essentiellement des données à l' application sur le chemin, sur le chemin de la demande, afin que vous puissiez sélectionner différents types d'informations. Il peut s'agir d'un identifiant utilisateur, d'un e-mail, quelque chose comme ça, tout ce qui a du sens dans votre application. Passons maintenant à la vitesse supérieure et une pause dans les requêtes, car c'est ainsi qu'un client peut fournir des données à une application. Pour l'application Spring Boot, nous voulons créer un utilisateur, non ? Nous allons dire créer un utilisateur. Lorsque nous créons un utilisateur, nous ne voulons rien récupérer, mais vous souhaitez mettre à jour ce contrat. Ensuite, nous allons dire ici, publier la cartographie, non ? Parce que nous voulons fournir certaines données à nos sites Web, ces données devraient être les informations de l'utilisateur, n'est-ce pas ? Le prénom, le nom de famille, etc. Nous allons donc dire Ajouter un utilisateur, et c'est tout. Et ici, sur les paramètres, nous devons fournir quelque chose comme une réponse, un corps de demande. Cette annotation indique à Spring Boot qu'elle doit extraire certaines données du corps de la requête et les placer dans un objet. Cet objet devrait être, par exemple le modèle utilisateur, n'est-ce pas ? Cela signifie que sur la carte utilisateur, nous pouvons dire « put et « user point get firstName suivi de l'objet réel. Oui, je n'ai rien à rendre ici, non ? Parce que la méthode n'a aucun type de retour. En d'autres termes, j'extrait le modèle utilisateur de la demande et je le place sur ce mappeur utilisateur. Faisons ça. Et la première fois, je vais essayer avec un débogueur pour assurer que l'objet utilisateur est correctement rempli. Oui, donc l' application est lancée. Je vais donc créer une demande de publication. Je vais créer un nouvel onglet ici dans Postman. Et je vais sélectionner ici le post, c'est vrai. Je vais dire Ajouter un utilisateur. Et juste ici, sur le corps, je vais dire votre ligne, et je vais sélectionner l'application JSON json ici. Je dois fournir ci-contre qui contient les informations réelles pour l'utilisateur. Je ne veux pas créer que Jason suive le schéma de cet objet ou de l'objet du modèle utilisateur, n'est-ce pas ? Vous devez donc communiquer le prénom, le nom famille et l'identifiant de membre. Je peux simplement les obtenir depuis l'autre onglet. Et bien sûr, je vais leur donner des valeurs différentes, par exemple Daniel, Craig. Et cela devrait être une valeur comme n'importe quel entier que nous voulons. Si nous cliquons sur Envoyer, nous pouvons voir que nous obtenons une erreur appelée erreur interne du serveur ou que quelque chose s'est produit. Voyons ce qui s'est passé. Donc, si nous examinons les journaux, nous pouvons voir qu'il est impossible de créer une instance de modèle utilisateur, existe aucun créateur tel que le constructeur par défaut. C'est donc une flèche que vous pouvez probablement voir assez souvent, si vous jouez avec des objets, avec la sérialisation, la désérialisation, des choses comme ça, qui nous indique en fait que lorsque vous fournit ce Json, non ? Et le printemps avec la réception de ce Json, il essaie essentiellement de créer un objet modèle utilisateur. Mais lorsqu'il essaie de créer cet objet modèle utilisateur, il n'utilise pas ce constructeur, n'est-ce pas ? Qui possède ces trois paramètres. Au lieu de cela, il s'attend à avoir un constructeur sans paramètres pour simplement créer une instance. Ensuite, il prévoit d'utiliser les méthodes setter pour définir ces trois champs un par un. C'est ce à quoi s'attend réellement le cadre de la civilisation Jackson , n'est-ce pas ? Il s'agit du composant du tremplin qui traite de la sérialisation et de la désérialisation. En d'autres termes, il suffit de fournir ici un constructeur par défaut sans paramètres. Et cela fonctionnera en créant à nouveau, en réexécutant l' application avec le mode debug. Cela aurait dû commencer. D'accord ? Maintenant, revenez à Postman et cliquez sur Envoyer, cela indique que nous avons une mauvaise demande. Voyons quelle est l' erreur maintenant, elle indique que valeur numérique de l'erreur d'analyse JSON est hors de portée, n'est-ce pas ? Il semble donc que ce nombre que nous ajoutons ici soit hors de la plage des entiers, il suffit donc d'ajouter un nombre plus petit ici, non ? Maintenant, si vous cliquez sur Envoyer, nous pouvons voir que cela fonctionne. Donc, si nous cliquons sur ce paramètre utilisateur, nous pouvons voir qu'il contient les bonnes valeurs. Et si nous cliquons sur F9 pour continuer l'exécution, la valeur doit être stockée sur la carte. Donc, si j'utilise l'autre onglet pour appeler getUser pour Daniel, nous pouvons voir que nous avons obtenu la bonne réponse. C'est ainsi que nous ajoutons réellement des données à notre API. 5. Mettre en œuvre des réponses standard: Une chose que je voulais également mentionner à propos fonctionnalité de ces manettes est que, généralement, lorsque vous jouez avec des microservices, vous devez être en mesure de spécifier le bon statut pour votre introduction pour votre demande. Dans ce cas, nous pouvons voir que nous n'avons que le statut 200 pour toutes les demandes que nous avons faites. Est-ce le statut par défaut, 100, d'accord ? En HTTP, le protocole signifie que l'interaction se déroule avec succès et que tout a bien fonctionné. Maintenant, vous pouvez également rechercher si le statut HTTP est en ligne, et voici la liste complète des statuts mentionnés par un protocole, n'est-ce pas ? Donc, par exemple, si vous avez le statut 500-599, cela devrait être une erreur de serveur. Les réponses réussies sont 200 à 299. Et ce testament a également toutes sortes de statuts, c'est comme si vous répondez par 201, cela signifie que vous avez créé la ressource avec succès. Toutes sortes de modèles d' interaction qui se sont produits dans votre application, n'est-ce pas ? Tellement bien conçu. serveurs Web, les réponses et le statut de votre demande doivent refléter ce qui s'est réellement passé dans votre application par le biais de ce code de statut. Et au printemps, il y aurait un moyen de le faire dans les contrôleurs en utilisant un objet que nous devons renvoyer à chaque méthode , appelé entité de réponse. Et cette entité de réponse est un type générique. Nous pouvons également ajouter ici un objet d'état http, par exemple et cela signifie en fait que nous pouvons renvoyer à partir de cette méthode quelque chose comme return, response, entity, point accepted, point built responsabilités. Il suit un modèle de constructeur. Et quand on dit accepté ici, cela signifie que nous ajoutons ce statut HTTP accepté, soit 20,2 sur la réponse, non ? Nous fabriquons cet objet. Donc, en gros, maintenant, lorsque nous exécutons l'application et que nous créons un nouvel utilisateur. Alors maintenant, quand nous reprenons la poste et disons « Ajouter un utilisateur », nous fournissons ici quelques données. Nous cliquons sur Envoyer. Nous pouvons voir que sur la réponse, nous arrivons à zéro pour l'accepter, non ? C'est un code de statut que nous ajoutons ici. Ceci, bien sûr, pour la meilleure pratique de votre candidature, n'est-ce pas ? Maintenant, la même chose peut être faite ici et partout dans votre application. Dans n'importe quel contrôleur, vous devriez avoir ce type d'interaction. Il faut également mentionner que le contrôleur interne peut également avoir d'autres types de méthodes, non ? Également géré par le protocole HTTP, par exemple si vous recherchez des méthodes HTTP, en fait celle-ci, vous pouvez voir que nous avons un certain nombre de méthodes ici, n'est-ce pas ? Jusqu'à présent, nous utilisions les méthodes GET et post. Mais vous pouvez aussi avoir la tête, la suppression, les options de connexion, les plateaux, les patchs, etc. Par exemple, si nous voulons utiliser la suppression, n'est-ce pas ? Si nous voulons supprimer un utilisateur, par exemple , il suffit d'aller ici, de copier cette méthode, disons de supprimer le mappage. Et ici, nous devons identifier l'utilisateur, par exemple, nous devons dire supprimer l'utilisateur suivi d'un nom d'utilisateur, qui est à nouveau un paramètre de variable de chemin, n'est-ce pas ? Nous pouvons donc dire ici, supprimer suivi du nom d'utilisateur, ce qui signifie que nous retirons simplement l'utilisateur de notre carte. Et lorsque nous renvoyons l'entité de réponse, nous pouvons simplement dire supprimée ou nutrition s'il y a un statut sans contenu, peut être utilisée pour les opérations de suppression, n'est-ce pas ? Donc, si nous rechargeons simplement l'application maintenant, et d'ailleurs, lorsque nous redémarrons l'application, ce qui est le seul moyen pour que les modifications prennent effet, la carte se vide à nouveau, donc seuls ces deux utilisateurs être ajouté depuis le constructeur, non ? Donc, si nous ajoutons des utilisateurs , puis que nous arrêtons l'application et que nous la redémarrons, les nouveaux utilisateurs ne figureront pas sur la carte lorsque la partie supérieure sera redémarrée, n'est-ce pas ? Parce qu'il est bien sûr stocké en mémoire. Voyons voir, nous voulons retrouver l'utilisateur Daniel devrait être là, en fait maintenant, ou ce doit être l'utilisateur John, non ? Il s'agit donc de l'utilisateur, et maintenant nous voulons le supprimer. Nous voulons donc créer un nouvel onglet et dire Supprimer. Il s'agit de la méthode de demande de suppression du type de demande pour être plus précise. Et je vais dire supprimer l'utilisateur suivi de John, écrivez-le, supprimez-le. Il indique zéro pour l'instant le contenu, ce qui signifie que le contenu est supprimé. Ensuite, je vais cliquer à nouveau sur Envoyer pour obtenir l'utilisateur John. Encore une fois, je constate que je n'ai rien. Bien entendu, nous pouvons aussi remodeler un peu pour dire que si la carte des utilisateurs contient un nom d'utilisateur clé, je vais le renvoyer directement. Sinon, je vais dire renvoyer une entité de réponse point introuvable, construite. Et ici, bien sûr, je dois renvoyer une entité de réponse du modèle utilisateur. Et ici, je dois dire entité de réponse de celle-ci. Et cela devrait être en fait optionnel, facultatif en plus de celui-ci. Donc, en d'autres termes, si j'ai l'utilisateur sur la carte, je renvoie l'utilisateur réel. Mais si je ne le fais pas, je vais retourner introuvable, soit 404, non ? Réexécutons donc l' obligation de voir cette fonctionnalité inactive, n'est-ce pas ? Je vais donc récupérer un utilisateur John. Je peux voir que je l'ai parce que je viens de redémarrer l'application et que les données renseignées ont été lancées. Le constructeur se trouve en fait sur la carte. Maintenant, je veux supprimer un utilisateur John, non ? Quand je récupère l'utilisateur John, je peux voir que j'ai 404 introuvable et non 200. OK. C'est ainsi que nous pouvons, bien entendu, mettre à jour le statut HTTP pour refléter la bonne opération qui a eu lieu dans une autre application. est ainsi que nous avons découvert la façon dont nous pouvons jouer avec les manettes, la manière dont nous pouvons obtenir certaines données des clients SAP, de Postman, et aussi la manière dont nous pouvons récupérer les données de manière appropriée. Passons maintenant à la vitesse supérieure et parlons des services du framework Spring Boot. 6. Créer des services dans Spring-Boot: Très bien, bon retour. Donc, jusqu'à présent, nous allons travailler avec le contrôleur REST. Nous avons vu comment ajouter et obtenir des informations à partir de notre application Spring Boot en tant que client HTTP et également jouer avec Postman pour lancer vos requêtes. Nous allons maintenant poursuivre avec un changement structurel par rapport à un changement structurel par rapport l'application car, comme je l'ai mentionné initialement, un contrôleur REST est le point d'entrée de votre application. Cela vous permet donc de spécifier comment vous devez obtenir les données de vos clients et comment vous devez les restituer. Mais généralement, ces composants devraient transmettre l'interaction au sein votre application vers d' autres structures. En d'autres termes, vous ne devez pas ajouter logique d'application ou vous ne devez pas connecter à une base de données depuis votre contrôleur des risques. Vous ne devez obtenir que les données du modèle que vous souhaitez, puis appeler un composant différent, une classe différente dans souhaitez, puis appeler un composant différent, laquelle votre logique doit être exécutée, n'est-ce pas ? Le premier élément de ce type que nous allons aborder maintenant s' appelle un service. Nous allons donc créer ici un nouveau package appelé services. Il peut sembler que je crée ici un package pour chaque classe, mais je crée en fait un package pour chaque catégorie de classe. Parce que si vous souhaitez ajouter vos modèles, vous disposez d'un package dédié aux quatre mêmes contrôleurs, services et autres aspects. Donc, en général, vous devez structurer votre code de cette manière afin de le rendre évolutif. Je vais donc appeler ce service utilisateur. Désormais, un service dans Spring Boot est simplement la classe annotée avec l'annotation du service. Et cette annotation permet en fait à votre application d'être vue dans le framework d'injection de dépendances de Spring Boot, ou elle enregistre votre classe dans cette configuration. Donc, en d'autres termes, si nous cliquons sur cette interface pour voir ce qui se cache derrière elle ou pour voir l'implémentation. Nous pouvons voir que cette notation est essentiellement une interface car c'est ainsi que vous pouvez créer des annotations en Java. Et il contient également cette annotation de composant, qui est l'annotation racine dans Spring Boot et d'autres. Maintenant, le seul rôle fonctionnel de cette annotation est celui que j'ai mentionné précédemment, non ? Est-ce qu'il enregistre la classe dans le framework d'injection de dépendances. Et il a également un rôle informatif, non ? Cela vous indique que cette classe est censée effectuer une sorte de logique de calcul, soit en appelant des services externes, soit en effectuant des validations, soit en faisant tout type de logique ayant quelque chose à voir avec l'utilisateur gestion. Nous allons donc déplacer cette partie ici avec le stockage de la carte utilisateur dans ce service utilisateur et également cette initialisation particulière. Nous allons le mettre dans le contrôleur du service utilisateur ici même. Et bien sûr, nous n'allons pas avoir accès à cette carte dans la manette pour le moment. Nous devons créer des méthodes qui reflètent celles que nous avons dans le contrôleur REST. Pour permettre cette séparation, nous allons dire public, public, UserModel, GetUser. Et nous allons avoir ici le nom d'utilisateur, non ? Nous allons donc encore dire nom d'utilisateur point. Il s'agit donc d'une classe normale, n'a rien à voir avec le contrôleur REST, nous n'avons donc pas à renvoyer d'entités de réponse depuis les services. Il s'agit d'une classe qui se connecte à la façon dont nous récupérons les données sur le client HTTP. Il a donc un niveau de cadre moral, tout va bien. Mais dans un service ou de manière générique, dans n'importe quelle classe de composant, nous pouvons ajouter n'importe quel type de code Java simple de base. Il s'agit donc de GetUser. Idem pour l'utilisateur AD. Nous avons besoin ici d'un modèle utilisateur. Et ici, quand vous dites Put of user, et ici, nous pouvons dire nul ou quelque chose comme ça. Bien sûr, nous devons dire ici user.name, FirstName, puis user. Et nous n'allons rien rendre. Et nous avons également supprimé l'utilisateur, non ? Nous allons donc dire supprimer un utilisateur par nom d'utilisateur, prénom. En fait, nous allons dire supprimer le nom d'utilisateur. Maintenant, la principale question serait nous transférons cette logique dans cette classe de service utilisateur, n'est-ce pas ? Comment travaillons-nous avec cette classe depuis notre manette ? Parce que nous avons besoin d'une instance de service utilisateur dans notre contrôleur, n'est-ce pas ? Pouvoir faire exactement les mêmes choses, non ? Ajouter, supprimer un utilisateur. Donc, la façon dont nous procédons est d'abord, je veux dire, qu'il y a en fait deux manières. Un qui n'est pas recommandé dans un autre qui est recommandé. La première serait donc de créer une instance du service utilisateur, n'est-ce pas ? Soit en haut à droite, en tant que champ privé, soit sur le constructeur, écrivez. De cette façon, nous créons manuellement cette instance, n'est-ce pas ? Ainsi, tant que le contrôleur s'en ira, il aura une instance. C'est une façon dont cela fonctionnerait. Mais quand même, si nous en avons besoin, si le service utilisateur aura un constructeur dans le futur, disons, d'accord. Un service public aux utilisateurs, non ? Et ici, il aura besoin d'une autre classe qui ne concerne que la gestion des utilisateurs, donc cela n'a rien à voir avec les contrôleurs. Ensuite, nous devons mettre à jour ce constructeur ici, cet appel ici, c'est vrai, pour pouvoir obtenir cette dépendance, ce service de validation, par exemple, et fourni ici sur cette construction, ce problème prend de l'ampleur, non ? Au fur et à mesure que de nouveaux paramètres sont ajoutés , nous n'aurions plus aucun type de découplage entre la logique de traitement utilisateur et classes d'entrée-sortie, n'est-ce pas ? Nous mélangons donc les préoccupations si nous adoptons ce type d' approche ici même. Au lieu de cela, la méthode recommandée pour jouer avec les instances manière générique au printemps est utiliser la configuration d'injection de dépendances de Spring. Spring with présente donc ce modèle très intéressant que l' on retrouve également dans des frameworks externes tels que Juice, par exemple Google Juice, que l'on appelle l'injection de dépendance. Et essentiellement, un framework d'injection de dépendances n'est qu'un moyen d'obtenir instances dans notre application manière découplée sans utiliser le nouveau mot clé. Parce que chaque fois que vous utilisez le nouveau mot clé, vous rencontrez ce problème : lorsque vous avez besoin de la classe, vous devez également fournir toutes ses dépendances, n'est-ce pas ? Et cela pose problème, va de pair avec cette préoccupation. Le fait de mélanger le problème et le framework d'injection de dépendances vous permet d' aborder ce problème de manière très claire. Donc, en d'autres termes, ce que nous devons faire ici est de créer essentiellement un service utilisateur variable de niveau privé , et de l'ajouter ici sur ce constructeur. Ensuite, nous pouvons dire que ce point service est égal à service, ou nous pouvons renommer celui-ci. Il sait en fait que nous parlons de différentes variables ici. Le niveau de champ d'application un et le niveau de classe un. Mais qu'est-ce que c'est lorsque le contrôleur utilisateur est instancié, n'est-ce pas ? Ainsi, lorsque le framework instancie la classe de contrôleur utilisateur, il remarque que ce contrôleur utilisateur a besoin d' un objet de service utilisateur et qu'il essaie de créer une instance de la classe de service utilisateur. Et cela se passe dans les coulisses. Tu n'as pas à t'inquiéter à ce sujet. Et cela indique que le service utilisateur n'a aucun paramètre de constructeur et qu'il crée simplement l'instance comme vous le feriez, le nouveau mot clé. Au lieu de cela, si le service utilisateur contient des paramètres dans le constructeur, nous procéderons à une recherche dans le framework et essaierons de créer également une instance pour ces paramètres. Et ça se passera comme ça de manière récursive, non ? Jusqu'à ce qu'il parvienne à créer toutes les instances à résoudre. S'il parvient à créer une instance, il échouera simplement au moment de la compilation. C'est très utile parce que vous pouvez le voir tout de suite. Voyons donc cela en action. Je reçois donc ce service utilisateur ici. Et bien sûr, je peux utiliser la touche Contains ou le métal dès maintenant, car elle est interne au service utilisateur. Donc, au lieu de cela, je vais simplement dire entité de réponse du service utilisateur, en fait le service point obtient les utilisateurs par nom d'utilisateur. Et dans ce cas, je dois m'assurer que getUser renvoie null ou quelque chose comme ça. Si je n'ai pas la clé sur l'option Ajouter un utilisateur, je dois simplement rechercher le service point add user du modèle utilisateur que j'ai obtenu à partir des paramètres. Et je dois dire la même chose pour la suppression. Supprimez donc l'utilisateur par nom d'utilisateur. Donc, pour l'instant, nous allons exécuter notre application Faisons en sorte qu' elle soit d'abord compilée, n'est-ce pas ? Nous allons donc écouter le débogage pour voir un peu comment cette manette est instanciée, n'est-ce pas ? Comme vous pouvez le constater, le service utilisateur possède une instance. Le framework a créé cette instance de service utilisateur. Pour nous, il s'agit du framework d'injection de dépendances qui a créé automatiquement cette instance. Et c'est très pratique, non ? Il suffit de le fournir dans le constructeur, et c'est tout. Vous n'avez pas à vous soucier de la façon dont cette instance est créée. Bien sûr, exécutons-le pour voir s'il fonctionne toujours la fonctionnalité devrait être la même, non ? Je comprends donc l'utilisateur John. Je vois que cela fonctionne. J'ajoute un utilisateur, Daniel Craig. Il est passé à zéro pour l'accepter. Je demande pour l'utilisateur Daniel. Je le récupère. Je supprime l'utilisateur John. Cela a marché. Et puis si je demande à nouveau John, il semblerait que je n' ai pas l'utilisateur John. Voyons ce qui se passe. Habituellement, lorsque vous en avez 500, quelque chose ne va pas, soit une exception de pointeur nul soit quelque chose comme ça. Oui, en fait, nous avons cette NullPointerException. Ainsi, dans GetUser, nous pouvons voir que nous sommes désactivés en option. Celui-ci est lancé si vous avez une valeur nulle ici. Nous devons donc dire « nul ». Ainsi, lorsque vous dites facultatif ou nullable, si vous indiquez null ici, cela le transformera simplement en une option vide. D'accord ? Essayons à nouveau ce flux pour voir comment il fonctionne cette fois, non ? Donc je reçois l'utilisateur John, maintenant je le supprime. Et juste ici, quand je le reçois, je peux voir 404 Not Found. C'est vrai. Voici donc comment cela fonctionne. Donc oui, c'est ainsi que fonctionne le framework d'injection de dépendances. Fonctionne dans les coulisses d'un tremplin. Maintenant, je voudrais vous montrer une bonne pratique que vous devez vraiment intégrer, car c' est absolument obligatoire lorsque vous jouez avec co-design. Vous allez créer des services et jouer avec Spring Boot dans général, c' est-à-dire que vous devez généralement dépendre d'abstractions, vos classes, et non de classes concrètes. Et si nous jetons un coup d'œil ici, nous pouvons voir que la classe du contrôleur utilisateur dépend de la classe utilisateur, la classe de service utilisateur, qui est une classe concrète. Au lieu de cela, nous devons d'abord créer une interface appelée Actual Nous devons renommer la classe de service utilisateur en MPL ( implémentation du service utilisateur I). Je vais juste être bref. Et ici, je vais créer une interface appelée User Service. Et ce service utilisateur devrait contenir ces méthodes. Ajustez l'utilisateur sur l'utilisateur et supprimez l'utilisateur void. Et celui-ci devrait être un modèle utilisateur, non ? Cette interface doit bien entendu être mise en œuvre par l'implémentation du service utilisateur. Comme vous pouvez le constater, l' idée d'IntelliJ met en évidence le fait que nous avons implémenté cette interface maintenant. Et c'est l'idée centrale qui sous-tend cette stratégie : dans le contrôleur utilisateur, je vais demander l'interface, l'interface du service utilisateur, et non l'implémentation. Et Spring Boot fait ce qui suit. Lorsqu'il essaie d'instancier un contrôleur utilisateur, il examine le constructeur, il voit qu'il a besoin d'une interface, et il l'interprète de la manière suivante. La classe de contrôleur utilisateur dépend donc d' une classe qui implémente l'interface de service utilisateur. Il essaie donc de rechercher une classe qui implémente l'interface utilisateur. Dans ce cas, nous avons une classe unique qui implémente l'interface du service utilisateur. Et cela servira à en créer une instance. Si vous avez plusieurs classes implémentant la même interface et que vous demandez une interface et une classe, vous devez être plus explicite dans quelle classe vous voulez réellement, n'est-ce pas ? Et vous pouvez le faire en utilisant l'annotation du qualificatif. L'annotation du qualificatif vous permet simplement d'ajouter une chaîne et une chaîne que vous souhaitez ajouter ici. Cette chaîne doit également être ajoutée lorsque vous demandez une instance d'une classe, mais également lorsque vous créez cette classe, à droite, sur la définition de la classe. Donc, si vous avez deux classes, implémentez la même interface. Vous devez ajouter un qualificatif pour les deux afin que le ressort sache lequel il doit fournir à quel endroit. Vous pouvez également expérimenter et voir comment cela fonctionne en action avec deux classes. C'est donc ainsi que vous devez réellement créer un service de qualité de production, disons de mise en œuvre. Cela facilite également les tests car lorsque vous essayez de tester le contrôleur utilisateur, vous devez créer une nouvelle instance de contrôleur utilisateur. Mais lorsque vous souhaitez en créer une, au lieu d'avoir à créer toutes les dépendances avec toutes leurs dépendances, etc. Il suffit de marquer une interface ici et de fournir les Dominions étaient adaptés à toutes ces méthodes, n'est-ce pas ? Et tu as terminé. Vous n'avez pas à vous attarder sur les dépendances de l' implémentation du service utilisateur à tout cela. Il suffit de se moquer de cette interface. Et c'est tout, non ? Essayez également un test unitaire pour voir comment cela fonctionne. Vous allez voir une grande différence dans la façon dont vous implémentez les tests. Très bien, sur ce point, passons à la prochaine conférence où nous allons appeler un service externe depuis notre application Spring Boot. 7. Ajouter des configurations dans application.yaml: Bienvenue à nouveau. Dans cette conférence, nous allons remodeler un peu cette implémentation particulière du service temporel Comme vous pouvez le voir ici, nous utilisons l'utérus pour envoyer une requête get à cette API horaire mondiale afin d' obtenir le heure. Mais vous savez, ce point final peut changer au fil du temps. Il se peut que vous deviez utiliser une API différente ou que votre application comporte plusieurs points de terminaison et que vous souhaitiez les gérer à partir d'un seul endroit. Ainsi, au lieu de les rechercher dans toutes sortes de classes, il est généralement préférable d'avoir un flux de travail de configuration dans lequel vous pouvez stocker toutes vos constantes et les détails de votre application, qui peuvent être, qui doit être géré depuis un seul endroit dans un fichier de configuration dédié. Spring Boot possède ce mécanisme de configuration qui est très simple à utiliser et qui s'intègre très bien dans son framework d'injection de dépendances. Nous allons donc l' utiliser dès maintenant. Donc, tout d'abord, nous allons prendre la classe principale. Nous allons ajouter cette annotation pour activer les propriétés de configuration. Cela est nécessaire car nous allons utiliser une annotation de configuration dédiée qui est vraiment utile, obligatoire pour tous les fichiers de configuration. Nous allons donc créer un nouveau package appelé config. Et ici, nous allons l' appeler time API configure cette classe. Nous allons annoter avec l' annotation Configuration, qui la rend essentiellement disponible dans le système d'injection de dépendances de Spring Boot, mais aussi, mais indique également au framework Spring que cette classe doit être utilisée pour stocker les données de configuration. Nous allons également ajouter une nouvelle annotation appelée propriétés de configuration. Et nous allons le mettre à jour dans une seconde avec un paramètre dans cette classe. Nous allons avoir nos champs, que nous voulons récupérer dans le fichier de configuration. Dans ce cas, nous voulons obtenir le point final. Donc, en gros, nous voulons stocker celui-ci dans notre fichier de configuration et également sur le continent, car nous voudrions peut-être modifier la méthode de configuration interne du continent en fonction de la configuration interne. Nous allons parler de chaîne privée, terminaison et aussi de continents. Et nous allons créer des getters et des setters pour ces deux champs. Et où allons-nous stocker le fichier de configuration ? Nous allons aller dans le répertoire des ressources et créer un nouveau fichier appelé application point YAML, avec le nez à Logan dans cet emplacement, les ressources, directement dans les ressources annuaire. Et il recherchera le fichier yaml de cette application. Si cela est présent, il recherchera les configurations à l'intérieur. Donc, dans ce fichier de configuration, je vais dire point de terminaison de l'API api. Et ici, je vais coller le point final de notre application, qui est celui-ci, et vous avertir, collez également ici le continent, en l'occurrence l'Europe. fait d'avoir cette configuration ici nous permettra de stocker les données en un seul endroit. Maintenant, pendant ce temps, je configure peut-être sur les propriétés de configuration. Nous allons définir un préfixe pour notre configuration. Maintenant, un préfixe pour notre configuration est essentiellement ce que son nom l'indique, le préfixe sous lequel notre configuration de l'application doit être située dans le fichier yaml de l'application. Donc, dans ce cas, la valeur de notre préfixe doit être API, car sous cette clé API, nous avons ces deux champs que nous voulons stocker dans la classe time config. En d'autres termes, cela nous permet d'avoir toutes sortes de configurations hiérarchiques, non ? Et en fonction du préfixe, vous pouvez sélectionner la zone de la configuration que vous souhaitez stocker dans votre classe, n'est-ce pas ? Parce que vous ne voulez certainement pas avoir une grande classe avec toutes les configurations de l' application yaml, n'est-ce pas ? Très bien, donc une fois que nous aurons créé cette classe, nous l'utiliserons dans l' implémentation du service temporel. Nous allons essentiellement l' injecter, n'est-ce pas ? De la même manière que nous l'avons fait avec les autres services que nous avons ajoutés sur le constructeur. framework d'injection de dépendances a pris en charge leur initialisation. Nous allons donc dire configuration de l'API Constructor Time où vous souhaitez la stocker dans notre domaine, et c'est tout. Maintenant, nous allons l'utiliser, non ? Nous allons donc dire time API, config point, GET Endpoint. Nous allons concaténer cela avec get continent , puis avec le fuseau horaire obtenu à partir du paramètre. Nous allons également le rendre un peu plus court sur cette ligne. OK, donc le point final, si nous examinons un peu documentation et en utilisant la barre oblique, puis nous avons le continent, qui est l'Europe, et nous obtenons un fuseau horaire. Nous avons donc également besoin d'une barre oblique supplémentaire car le fuseau horaire est une chaîne directe. Nous devons donc ajouter un navire négrier supplémentaire. Ça devrait être ça. Mettons un point d'arrêt ici pour voir si cela fonctionne réellement. Très bien, nous allons maintenant faire une demande pour ajouter un utilisateur et nous allons examiner cette fois appelée configuration de l'API. Et nous pouvons voir que nos valeurs ont été correctement renseignées dans cette classe. Et si nous faisons la demande, cela devrait fonctionner comme prévu, non ? Donc on passe à zéro pour être accepté si on le récupère, oui. Devrait fonctionner comme prévu. Oui, c'est à peu près ainsi que nous pouvons jouer avec les classes de configuration dans Spring, mais nous pouvons également modifier certaines configurations par défaut qui sont lues par springboard, par exemple le port sur que notre application exécute, dans ce cas, le TDAH. Si nous voulons utiliser un port différent, nous pouvons facilement dire port serveur 9019. Et quand nous aurons réalisé l'application, Spring Boot lira cette configuration et modifiera le port en conséquence, n'est-ce pas ? Comme vous pouvez le constater, le changement a pris effet immédiatement lors de la prochaine exécution. Bien entendu, la documentation couvre toutes les configurations disponibles que nous pouvons ajouter ici. Vous pouvez également faire la même chose en utilisant le fichier de propriétés de l'application. Donc, si vous effectuez une recherche sur Internet et que vous accédez à ce fichier de configuration, c'est à peu près la même chose, sauf qu'il contient une méthode plus courte spécifier l'application de configuration. Yaml fonctionne à peu près de la même manière. Alors, avec cela, passons à la prochaine conférence. 8. Appeler des services externes via HTTP: Bienvenue à nouveau. Ainsi, généralement, dans un service Web, vous interagissez avec une base de données pour récupérer des données, les traiter, puis les transmettre à vos clients. Ou vous interagissez avec un autre service afin de récupérer des données ou d'ajouter des données à ce service afin d'exécuter un type de flux de travail professionnel que votre application est censée effectuer dans notre application. Supposons que chaque fois que nous ajoutons un utilisateur à notre carte, nous souhaitons également enregistrer l'heure de création en UTC à laquelle cet utilisateur a été créé pour l' heure de création de cet utilisateur. Et au lieu de le faire en appelant les méthodes natives que nous avons dans l'API Java, nous voulons utiliser une API externe ensemble afin de tenir compte des décalages temporels ou d'autres facteurs de ce type. Nous allons également le faire pour les besoins de l'exemple sur la façon d'effectuer un appel HTTP vers une API externe. que nous allons faire. L'API que nous allons appeler s' appelle World Time API. C'est très simple . Il vous suffit faire une demande à cette URL avec le fuseau horaire et vous obtiendrez parfois une largeur de charge utile JSON, puis nous allons utiliser celle-ci . Préparons donc un peu toutes les applications pour cela. Nous allons créer un nouveau service que nous appellerons Time Service. n'est pas forcément le meilleur nom, mais c'est celui que nous allons utiliser. Nous allons donc l'annoter avec l' annotation du service et nous allons également la modifier pour chronométrer mise en œuvre du service, n'est-ce pas ? Et nous allons utiliser l'interface Time Service. Alors, quelles méthodes devons-nous utiliser pour pouvoir réellement renvoyer l'heure réelle, n'est-ce pas ? Obtenez l'heure actuelle, nous pouvons dire obtenir l'heure actuelle. Et ici, nous pouvons fournir un fuseau horaire, non ? il s'agisse d'une ville en Europe ou dans d'autres régions du monde, nous voulons avoir le temps. Pour en revenir à la mise en œuvre, nous pouvons implémenter les méthodes. Juste ici. Nous pouvons, nous pouvons réellement créer le noyau, mais utilisons maintenant ce service dans la mise en œuvre de nos services. Ainsi, sur le constructeur, nous pouvons demander au framework d'injection de dépendances une instance du temps de service, des enquêtes sur le temps de service, des enquêtes sur le temps de service que nous pouvons également stocker en tant que champ privé, qui peut aussi être définitif d'ailleurs, non ? Même chose pour celui-ci car nous voulons créer les instances une seule fois, non ? Nous avons donc le service serve, le service time ici, et nous allons simplement l' utiliser avec la méthode Add User. Bien entendu, nous avons besoin d'un champ dans le modèle utilisateur lequel nous voulons stocker le type de création. Création. Vous avez également besoin du setter et du getter pour ce champ. Et nous allons le créer en utilisant la fonctionnalité d' idée intelligente. Nous avons donc trouvé un getter, et nous voulions aussi un setter dans ce domaine, n'est-ce pas ? Nous allons donc déplacer ces deux méthodes ci-dessous après la déconstruction. Nous avons donc maintenant une place dans notre modèle où nous voulons placer ce temps de création. Il suffit de dire «  time service point sur le modèle utilisateur, n'est-ce pas ? Lorsque vous dites point utilisateur, définissez l'heure de création. Et ici, nous devons dire que l' heure du service ne correspond l'heure actuelle d'Amsterdam, disons. Cela devrait être un moment. Disons donc que c'est en Europe par défaut. Amsterdam est la ville que nous voulons. Maintenant, bien sûr, ce fuseau horaire peut être récupéré auprès d'un service externe, les services de colocation, qui détecte la position en fonction de l'adresse IP du client. Vous pouvez donc développer cela encore plus pour obtenir des fonctionnalités de plus en plus complexes. Mais dans ce cas, nous allons simplement le laisser tel quel. La principale question qui se : comment trouver le temps ? Comment appelle-t-on cette API HTTP ? Pour cela, nous allons utiliser un client HTTP appelé union rest. En Java, nous pouvons réussir à être clients. Nous avons également une version intégrée, mais celle-ci est le moyen le plus simple que je connaisse pour faire une requête HTTP d'une application vers une API externe. Nous allons donc simplement importer l'unité de dépendance, tandis que Java va la placer dans le fichier Gradle de compilation et appuyer sur Sync. Voyez si c'est bien. 11311. Ça a l'air génial. Il a détecté l'existence d' une version plus récente de cette dépendance. C'est celui-là. Ainsi, dans notre service ponctuel, lorsque nous voulons connaître l'heure actuelle, nous pouvons dire quelque chose comme ça. Union Rest point, donnez-nous une URL ici. Et l'URL est celle que nous avons ici. Mais bien sûr, il doit inclure ce fuseau horaire. Alors on peut dire en tant que Jason. Cela permet donc de faire la demande et d'obtenir la réponse. Maintenant, Jason renvoie une réponse HTTP du nœud Jason, qui est un type de données plus primitif. Nous n'avons pas vraiment envie de faire ça. Nous voulons également le convertir en modèle. Voyons donc si nous avons d'autres options pour cela, pour ce client HTTP. Disons donc en tant qu'objet, non ? C'est ce que nous avons ici pour objet. Nous avons également la version asynchrone. Donc, lorsque nous disons objet, nous devons fournir ici une classe qui a le format de réponse que nous attendons de l'API, n'est-ce pas ? C'est donc quelque chose que nous devons créer à l'intérieur et à l'extérieur. Ainsi, dans les modèles, nous pouvons dire heure. Ou la réponse temporelle de l'API du chronomètre. Cela peut être un nom pour notre classe et nous avons deux options, non ? En définissant cette classe, nous pouvons soit créer un champ pour chaque paire clé-valeur que nous avons ici. Mais comme nous n'allons pas utiliser tous ces champs, nous allons utiliser uniquement celui-ci. Nous n'avons pas nécessairement besoin de tous les créer. Nous ne pouvons créer que celui-ci. Donc date et heure UTC, nous allons dire chaîne privée UTC date/heure, le nom doit correspondre. Nous pouvons ajouter des constructeurs, non ? Et aussi getter et setter pour ce domaine. Et nous allons déplacer le constructeur un peu plus haut ici, au niveau de la classe, nous allons dire json, ignore, ignore, ignore les propriétés, n'est-ce pas ? Cette annotation fait donc en sorte d'ignorer toutes les propriétés qui ne se trouvent pas ici en tant que champs de notre classe. Pour le moment, nous extrayons simplement ce dont nous avons besoin de cette charge utile. Donc, avec ce modèle, nous pouvons l'utiliser ici même. Et vous pouvez voir le service de chronométrage mis en œuvre. Nous pouvons voir la réponse de l'API temporelle à la classe. Et nous pouvons l'avoir ici. Prends du corps, d'accord. Il ne faut pas oublier ce corps car l'objet renvoie une réponse HTTP de votre type. Nous devons donc utiliser get body pour obtenir le bon objet de réponse réel. Une fois que nous avons cette réponse, nous pouvons dire que le point de réponse vous amène à la date/heure, d'accord, en extrayant le champ de notre classe. Très bien, voyons ce que nous avons fait jusqu'à présent, non ? Nous utilisons donc ce service pour extraire les deux heures ensemble de cette API externe, et nous plaçons cette heure dans un nouveau champ de notre classe UserModel. Maintenant, bien sûr, nous devons voir si cela fonctionne. Atteignons donc ce point d'arrêt et redémarrons notre application. Je vais simplement ajouter un point d'arrêt dans mise en œuvre de notre service chronométré pour voir si le charbon a été fabriqué correctement. Je vais donc ajouter cet utilisateur à nouveau et je pourrai voir cette réponse, non ? Et c'est celui-là. Je peux donc voir quelques données ici, ce qui signifie que j' ai reçu correctement la réponse de cette API externe. Si vous souhaitez déboguer plus de choses, vous pouvez également supprimer ce corps et utiliser cette réponse HTTP de réponse temporelle de l'API, n' est-ce pas ? Et puis dites point de réponse, obtenez le corps, obtenez UTC, date, heure. Parce que dans cette réponse HTTP, vous pouvez voir plus de choses, comme l'état HTTP ou s' il y a une mise en mémoire tampon des données, toutes sortes de détails peuvent être vus dans cet objet, n' est-ce pas ? Je vais donc y revenir. Et je vais voir cette réponse HTTP revenir correctement. Vous pouvez donc voir que nous obtenons le code de statut 200. Vous pouvez voir que nous n'avons reçu aucune erreur. Vous pouvez voir les en-têtes reçus de cette API. Nous pouvons tous les voir ici. Et nous pouvons également voir le corps. Le corps a ceci, cet objet avec notre type de données, droite, appuyez sur F9 pour continuer l'exécution. Et c'est tout, non ? Nous sommes arrivés à zéro pour l'accepter. Maintenant, si nous récupérons l'utilisateur, nous devrions également voir cette heure de création car ce get flow renvoie en fait l'objet entier et l'affiche sur la réponse HTTP. Il s'agit donc à peu près d'appeler un service externe depuis votre application dans Spring Boot. C'est une façon très intéressante de se connecter à d' autres services. Et dans la prochaine conférence, nous allons travailler un peu sur mise en œuvre du service, cette fois-ci, afin de le rendre un peu plus configurable. Alors, avec cela, passons à la prochaine conférence. 9. Configuration de MySQL avec Docker: Bonjour à tous et bon retour. Dans cette conférence, nous allons voir comment nous connecter à une base de données à partir d' une application Spring Boot. Parce que, comme je l'ai mentionné dans la conférence sur les services, le microservice peut soit se connecter à un service externe pour récupérer des données ou envoyer des données, soit se connecter à une base de données exactement pour la même raison. Un truc, non ? Vous avez donc besoin d'un moyen ou d'un endroit pour stocker vos informations et les récupérer depuis votre application. Et bien entendu, Bring Wood dispose d'un certain nombre de mécanismes qui nous permettent de le faire plus facilement que si vous le faisiez vous-même. Et il est également important d'envisager cela dans le contexte de plusieurs types et modèles de bases de données et de schémas de modélisation des données. Nous allons donc examiner cet exercice à partir des terres de cet écosystème de stockage de données complexe, disons, que nous avons actuellement dans le secteur. Donc, en gros, ce que nous allons faire dans cette conférence est remplacer cette carte utilisateur par ma table de suite, qui aura en fait un schéma très similaire à celui que nous avons dans ce modèle utilisateur, n'est-ce pas ? Donc à peu près les mêmes champs avec, disons, un identifiant qui servira identifiant pour un enregistrement dans la base de données en tant que clé primaire. Donc, en gros, cette conférence comportera deux parties. La première sera celle où nous allons créer une base de données et la configurer pour créer la table elle-même. La deuxième partie consistera à modifier réellement notre application Spring Boot pour interagir avec la base de données. Commençons donc par la première étape, non ? Je vais ouvrir mon terminal et utiliser Docker pour exécuter un conteneur MySQL. Bien entendu, Docker n'est pas une condition préalable à ce cours. Je ne m'attends pas à ce que tu saches ce que c'est. C'est pourquoi je vais faire une toute petite introduction à cette technologie en particulier et je vais expliquer toutes les commandes que j' exécute étape par étape. Il peut donc être plus facile pour vous de suivre. Tout d'abord, l'environnement d'exécution du conteneur Docker. Vous pouvez en fait vous rendre ici sur docs.docker.com. Et vous pouvez trouver de nombreux détails sur Docker en tant que technologie. En résumé, Docker est une technologie qui nous permet de gérer des conteneurs. Et le conteneur est essentiellement une machine virtuelle légère qui ne nécessite pas d'hyperviseur, comme VirtualBox, VMware ou Hyper-V. Vous pouvez donc essentiellement exécuter un conteneur en utilisant dark si vous installez le Docker Engine sur votre système d'exploitation, et bien sûr si vous exécutez certaines commandes. Donc, par exemple, nous voulons exécuter un MIC appelé container sur cette machine Docker est déjà installé ici pour Mac. Donc, pour pouvoir exécuter un conteneur MySQL, je dois dire Docker run moins E, mon mot de passe racine carrée, puis un mappage de ports, puis mon image de suite suivie de la version. Voyons donc ce que fait réellement cette commande. Docker Run signifie que je souhaite exécuter un conteneur en utilisant Darker, n'est-ce pas ? Ensuite, moins e dit : « Je veux créer cette variable d'environnement et la rendre disponible dans le conteneur ». La variable d'environnement est essentiellement une paire de données clé-valeur accessible dans un environnement spécifique, soit dans l' émission en cours, soit dans un conteneur, généralement au niveau du système, n'est-ce pas ? C'est la raison pour laquelle on l'appelle essentiellement variable d'environnement. Donc, dans ce cas, je veux définir le mot de passe root pour l'utilisateur root car pour pouvoir se connecter à ma suite, nous devons avoir le mot de passe de l'utilisateur root. Et dans ce cas, la valeur du mot de passe sera simplement testée. Et puis moins p signifie que je veux créer un mappage de port. Un port est essentiellement un identifiant pour une application dans le contexte d' un système plus vaste comportant plusieurs processus. Ainsi, un système d'exploitation possède un certain nombre de ports auxquels vous pouvez vous connecter via le réseau. Et chaque port identifie essentiellement une application. Et l'application peut recevoir des connexions sur ce port, les gérer et obtenir des réponses, etc., non ? Donc, dans ce cas, je tiens à dire que je veux cartographier ce traité portuaire O6 à partir de ma machine locale. Depuis la machine lorsque j' exécute cette commande, également connue sous le nom d'hôte du port 3306 dans le conteneur. Maintenant, dans le conteneur de ce port, mon processus secret se développe réellement. C'est pour cette raison. J'ai choisi ce portrait, l'O6 directement sur le contenant. Donc, sur un axe, le processus passant par ce port et le port hôte peut être différent. Je peux donc avoir une valeur différente ici. Et depuis notre application Spring Boot, lorsque je veux me connecter à cette base de données MySQL, je dois spécifier le port hôte lequel je suis assis. Maintenant, par souci de simplicité, je peux simplement dire que je souhaite utiliser le même port, qui est celui par défaut pour mon école, afin de ne pas rencontrer d'autres problèmes. Je veux dire, vous pouvez simplement voir si le port n'est pas correct car il échouera simplement lors de la connexion à la base de données. Vous pouvez donc immédiatement le remplacer par le bon. L'argument suivant est moins d, et moins d les représente sur le conteneur. Ainsi, lorsque j'exécute cette commande, le terminal n'attendra pas que le conteneur soit tué ou arrêté. Cela démarrera simplement un conteneur en arrière-plan. Et le dernier argument de cette longue commande est ma suite, suivie de Calcium, suivie de la dernière. Ma suite est essentiellement le nom de l'image que nous voulons exécuter. Les images des conteneurs peuvent être trouvées si vous recherchez l'image Docker de ma suite. Et vous pouvez voir ce site Web, Docker Hub, où vous trouverez pratiquement toutes les images que vous pouvez rendre publiques, n'est-ce pas ? They going up est donc essentiellement un dépôt d'images public. Et celle-ci est la ligne officielle. Donc, si vous êtes, par exemple, si vous exécutez cette commande docker, extrayez ma suite. Il commencera à télécharger cette image sur votre système local directement, à partir du référentiel distant. J'ai déjà cette image. Téléchargez-le pour ne pas avoir à le télécharger à nouveau. Maintenant, ce que signifie la dernière version ici, c'est la version de l'image, car l'image peut avoir plusieurs balises ou plusieurs versions. J' utilise donc actuellement la dernière version, mais vous pouvez également utiliser une ancienne version si vous voulez la 8031 ou toute autre version. Nous allons donc exécuter cette commande. Comme vous pouvez le constater, nous avons reçu cette erreur qui indique que le port est déjà alloué, probablement parce que j'ai ce conteneur en cours d'exécution Supposons que docker ps nous indique quels conteneurs sont actuellement en cours d'exécution. Donc, par exemple je peux dire que docker tue ce conteneur et cette commande détruira simplement le conteneur en cours d'exécution, que j'ai créé précédemment. Donc, si je lance Docker PS maintenant, cela indique que je n'ai aucun conteneur en cours d'exécution. Et si j'exécute la commande qui redémarrera un conteneur, qui serait bien sûr un conteneur différent. Dans ce cas, je récupère ce très gros identifiant, et il s'agit de l'identifiant du conteneur qui devrait essentiellement être un identifiant unique que Docker génère pour nous. Maintenant, si je dirige le Corp, oui, je peux voir que le conteneur fonctionne. J'ai cet identifiant ici qui identifie que le conteneur est essentiellement une version plus courte de celui-ci. Ensuite, je peux voir l'image utilisée par le conteneur, suivie de la première commande qui est exécutée lorsque le conteneur démarre. Et cela se trouve à l'intérieur de l'image elle-même, nous ne pouvons donc pas contrôler cela et la forêt. D'autres informations importantes concernant ce conteneur sont le statut de création, etc. Le mappage des ports que nous avons vu précédemment est également affiché ici. Nous avons donc ce conteneur en marche. allons maintenant nous connecter à ce conteneur afin de pouvoir configurer la base de données MySQL. Donc, pour se connecter à ce conteneur, il suffit de dire docker exec minus IT, suivi de l' ID du conteneur, suivi de batch. Donc, s'il s'agit d'un terminal interactif. Je souhaite exécuter cette commande. Exact signifie que je souhaite exécuter cette commande en mode interactif sur ce conteneur. Et la commande est simplement Bash pour que je veuille avoir accès à ces conteneurs par le shell. Donc, si j'exécute cette commande, je peux voir que le shell a réellement changé. Et cela a changé parce que maintenant j' exécute essentiellement des commandes dans le conteneur, n'est-ce pas ? Je ne suis donc plus sur l'hébergeur local. Je suis sur le système de fichiers conteneur et sur le système de conteneurs en gros, par exemple si j'exécute la commande ls, je peux voir que j'ai un ensemble de fichiers différent, non, par rapport à celui que j'ai reçu auparavant. Maintenant, bien sûr, ce qui m'intéresse ici, dans ce conteneur, c'est d'accéder au laboratoire. Pour cela, je dois me connecter sur mon écran. Je dois donc dire que ma suite moins U, qui signifie User Route, entourée à droite de la connexion avec un utilisateur root moins p, puis Enter, maintenant je dois entrer le mot de passe de l'utilisateur root, qui est en fait celui que j'ai fourni via cette variable d' environnement. Je peux donc dire test ici, j'ai juste tapé test puis Entrée. Et je peux le constater. Et maintenant je suis connecté à la base de données de mes suites. Donc, la première chose que je dois faire ici, car il s'agit d'une nouvelle base de données. Je dois dire créer un test de base de données. Je veux créer une nouvelle base de données appelée test et cette commande, maintenant je dois utiliser cette base de données. Je dois donc dire test d'utilisation. Et maintenant, je dois créer une table dans cette base de données. J'ai donc déjà une requête qui me permet de créer cette base de données, qui est celle-ci, non ? J'intègre donc cette entité utilisateur de table, qui possède cette clé primaire. Et je l'ai fait, cela s'incrémente automatiquement. Et puis j'ai obtenu les champs qui font déjà partie du modèle utilisateur notre application Spring Boot, c'est vrai, donc je vais simplement copier cette commande, coller ici, puis la requête a été exécuté avec succès. Je veux obtenir des données à partir de cette nouvelle table. Bien sûr, je n'obtiendrai aucun résultat, mais juste pour voir si le tableau a été créé correctement, non ? J'en ai un set vide. Maintenant, la base de données est essentiellement configurée. n'y a rien d'autre à faire ici qui permettra à l'utilisateur application Spring Boot d' ajouter des données dans cette base de données. 10. Configurer notre application Spring-Boot pour fonctionner avec MySQL: Passons donc à une idée intelligente pour commencer à configurer ces pré-multiplication. Très bien, la première chose à faire est bien sûr d'importer certaines dépendances car nous n'avons pas de support intégré pour l'accès aux données dans la dépendance Web Spring Boot Starter. Nous devons donc ajouter les deux dépendances suivantes. Pour le moment, nous allons voir si nous en avons besoin d'autres. En cours de route. Nous allons rechercher sur le Web Spring Boot Data, JPA, Maven Central. JPA est donc l'abréviation de Java Persistence API. Et Spring Boot possède une dépendance dédiée qui traite de toutes les abstractions ou s'agit-il en fait de l'API complète qui nous permet d'accéder aux données à l'aide de Spring Boot. Nous allons copier cette dépendance, Spring Boot Starter Data JPA. Ensuite, nous allons également rechercher connecteur MySQL, Java, Maven Central. Il s'agit essentiellement d'une dépendance qui nous permet de nous connecter à ma base de données SQL. Vous devez essentiellement disposer d'un connecteur pour chaque base de données à laquelle vous souhaitez vous connecter. Et ils devraient se trouver dans le même référentiel. Donc, toujours sur mon central. Mais celui-ci est pour ma suite et nous devons , bien sûr, être importants. Je vais appuyer sur Gradle Sync en utilisant le raccourci. Et bien sûr, nous allions attendre que Gradle prenne en charge les dépendances pour pouvoir commencer à travailler sur le projet. Très bien, maintenant que nous avons les dépendances activées, nous devons apporter les modifications suivantes. Nous allons donc créer un nouveau package que nous appellerons données. Donc, ce package de données, je vais créer une classe que je vais appeler entité utilisateur. Et cette classe est celle que nous allons utiliser pour envoyer des données à la base de données et les récupérer. Vous vous demandez peut-être pourquoi n'utilisons-nous pas la classe UserModel pour cela ? Eh bien, parce que cette classe fait partie du modèle de domaine que nous utilisons pour communiquer avec le contrôleur REST. Ou vu cela, ce schéma est celui que nous obtenons directement de l'utilisateur utilisant Postman. Nous devons donc découpler ces deux modèles, non ? Parce que nous n'avons pas nécessairement exactement la même structure dans une application réelle. Du point de vue du client, en passant par la base de données sur les femmes, nous avons peut-être des modèles différents à cet étage. C'est pourquoi j'en crée un autre, qui sera essentiellement très similaire à celui-ci. Je vais donc essentiellement copier et le coller ici. Je vais dire entité utilisateur. Celui-ci est un peu différent car il doit implémenter une interface sérialisable, non ? Dans la vraie vie. Donc, la raison pour laquelle il doit implémenter Serializable est que cette classe sera transmise à la base de données, n'est-ce pas ? Il doit correspondre aux colonnes du tableau que nous avons créé. Donc, comme vous l'avez probablement vu ici, nous avons le prénom, le nom de famille, identifiant de membre, l'heure de création. Ces champs sont donc en fait ceux-là, mais bien sûr, écrits avec un trait de soulignement entre les mots, n'est-ce pas ? Ils doivent donc essentiellement correspondre à ceux que nous avons dans le tableau. Et nous devons également annoter cette classe avec une annotation très importante appelée entité, n'est-ce pas ? Cette classe, qui vient pour Java, Persistence API, nous indique essentiellement que cette classe doit être associée à une table dans notre base de données, n'est-ce pas ? Nous pouvons également annoter les champs avec toutes sortes d'annotations liées à la classe d'entités. Nous pouvons donc personnaliser encore plus cette classe si nous avons un scénario plus complexe. Mais pour ce cours, nous n'allons pas entrer dans trop de détails sur la façon de configurer cette classe. Nous allons simplement faire preuve de simplicité pour le moment afin de voir comment les choses se connectent de bout en bout. Et vous pouvez également explorer d'autres aspects de ce domaine si cela vous intéresse. Nous avons donc obtenu la classe d'entités. Le deuxième aspect que nous devons créer est le référentiel utilisateur. Maintenant, le référentiel utilisateur est essentiellement une interface qui étend le référentiel de crédits de l'entité utilisateur suivi d'une chaîne. Alors pourquoi avons-nous ici Nous avons une interface appelée dépôt utilisateur, qui est annotée avec un dépôt dans lequel s'étend réellement le référentiel crud. Cette interface, qui fait partie de Spring Boot, est essentiellement la principale abstraction d'un accès aux données qui fournit des opérations de création, de lecture, de mise à jour et de suppression. Et nous devons également fournir ici les objets sur lesquels nous voulons exécuter ces opérations avec le cours de base de données. Et aussi la clé primaire que nous voulons utiliser lorsque nous exécutons les opérations sur ces entités, n'est-ce pas ? Ainsi, comme vous pouvez le voir sur cette interface, nous avons enregistré, sauvegardez tout condamné à une amende par ID. Donc les opérations que nous pouvons exécuter directement. Maintenant que nous avons ce référentiel utilisateur ici, nous pouvons l'utiliser directement dans implémentation de notre service utilisateur. Nous pouvons donc l'injecter ici, référentiel utilisateur, nous pouvons le stocker sous forme de champ et nous pouvons également l'utiliser. Par exemple, dans GetUser, nous pouvons dire renvoyer le référentiel utilisateur point find by ID. Nous devons maintenant fournir une pièce d'identité. Nous avons donc ajouté ici cette recherche par prénom metal, qui nous permet essentiellement de faire une requête dans notre base de données en utilisant le prénom et la droite, et en récupérant une entité utilisateur. Tout d'abord, nous avons ce petit problème : nous devons convertir l' entité utilisateur en modèle utilisateur. Et pour cela, nous allons créer un mappeur écrivant une classe spécialement conçue pour passer d'une entité utilisateur à un modèle utilisateur et vice versa. Mais avant d'entrer dans cette partie, nous allons également utiliser le référentiel utilisateur pour ajouter des données. Donc, pour ajouter des données dans la base de données, nous devons utiliser la méthode save. Et en ce qui concerne la méthode de sauvegarde, nous devons bien sûr fournir une entité utilisateur, n'est-ce pas ? Nous le fournirons immédiatement une fois que nous aurons créé les cartographes. Mais implémentons également une méthode de suppression des utilisateurs. Nous allons donc dire supprimer le référentiel utilisateur par nom d'utilisateur, non ? Nous avons donc besoin d'une autre question ici. Pour ce faire, il faut également créer une nouvelle méthode, supprimer par prénom. Nous allons donc dire ici, supprimer par prénom, en ajoutant le nom d'utilisateur. Et nous devons également supprimer ces cartes utilisateur. En fait, nous n'en avons plus besoin. Et créons également cette classe de mappage que j'ai mentionnée précédemment. Nous allons donc créer un nouveau package appelé Mappers. Un mappeur est donc essentiellement une classe, disons un mappeur d'entités utilisateur qui nous permet passer d'un type à un autre. Créons donc une interface d'abord appelée Entity Mapper. Et cette interface, disons, doit générer des paramètres et possède deux méthodes. mappeur nFET nous permet donc essentiellement de convertir de ce type à ce type. Nous allons donc revenir, vous dites carte, puis nous allons prendre l'entité comme un t, comme paramètre. Et nous proposons également l'opération inverse où nous convertissons, où nous obtenons un t à partir d'une écriture que vous écrivez. Disons donc que c'est l'abstraction que nous allons utiliser. Et le mappeur d'entités utilisateur implémentera le mappeur d'entités de l'entité utilisateur et du modèle utilisateur. D'accord ? Donc, si nous implémentons ces méthodes, nous pouvons voir que la première nous fournira un modèle utilisateur issu d'une entité utilisateur. La carte inversée nous donnera une entité utilisateur à partir d'un modèle utilisateur. Nous allons donc également faire cette classe un composant, non ? Parce que nous l'utilisons comme un outil. Dans ce cas, nous pouvons simplement renvoyer le modèle utilisateur de l'utilisateur, en fait le nom, le prénom, le nom de famille, l'identifiant du membre et l'heure de création de l'entité , bien sûr, avec un nouveau et, bien sûr , il s'agit d'un un peu redondant dans ce cas, mais dans un scénario réel, vous allez avoir ces modèles dérivés. Vous devez donc ajouter quelques modifications ici, non ? Certaines classes n'auront pas de paramètre spécifique, l'autre en aura un. Vous devez donc effectuer quelques conversions ici pour effectuer une certaine désinfection de temps en temps. Je fais donc cela plutôt comme un exercice visant à savoir si cela peut se produire et se produira dans un scénario réel. Maintenant, avec ce mappeur d' entités utilisateur, nous allons l'injecter dans l' implémentation du service utilisateur. Mais bien sûr, nous allons utiliser l'interface, accord, pour découpler les choses. Donc, le mappeur d'entités, où vous devez utiliser le mappeur d'entités, qui est celui-ci, disons utilisateur, disons que le mappeur d'entités est, pour être sûr que nous l'avons obtenu sous forme de champ. Et c'est ici que l'on trouve par prénom, non ? Ainsi, lorsque nous récupérons l'entité utilisateur, nous allons dire carte parce que nous avons l'entité et que nous voulons retrouver le modèle utilisateur. D'accord ? C'est donc ce que nous voulons. Maintenant, lorsque nous voulons enregistrer et utiliser une entité, ce que vous voulez dire Entity Mapper Dot Inverse Map. Et nous allons laisser passer l'utilisateur, non ? Nous transmettons le modèle utilisateur, la carte inversée récupère une entité utilisateur utilisée pour la même opération. C'est donc essentiellement ainsi que nous procéderions. Bien sûr, nous n' avons pas de gestion des erreurs, nous n'avons pas de gestion des exceptions dans ce code. C'est aussi simple que possible pour que vous puissiez avoir l'idée principale. Nous pouvons également les rendre définitifs. Et la dernière chose dont nous avons réellement besoin dans cette application pour pouvoir nous connecter à la base de données est d'ajouter ici la configuration yaml de l'application , n'est-ce pas ? Donc, pour cela, en gros, terminez le port et cette configuration est la suivante, n'est-ce pas ? Donc j'ai juste collé cette configuration à partir d'un fichier. La configuration précédemment restaurée est essentiellement une configuration de source de données Spring dans laquelle nous transmettons l'URL, droite, qui inclut le port du point de terminaison. Il s'agit du port hôte, très important. Donc, le premier de cette commande est là, non ? Donc celui-ci, le premier , le port hôte, suivi du nom de la base de données. Ici, nous avons le nom d'utilisateur et le mot de passe. Avec ces informations, nous pouvons donc nous connecter à la base de données. Bien entendu, il en existe d'autres dans les applications de production Vous devez spécifier toutes sortes de configurations de pool de connexions et de nombreux autres détails. Mais pour garder l'exemple, il s'agit de la configuration minimale que nous devons fournir ici pour pouvoir se connecter à la base de données. Exécutons donc cette application en mode debug pour voir si elle fonctionne. Ce ne sera probablement pas le cas, car cela ne fonctionne jamais du premier coup. Donc, comme vous pouvez le voir ici. Nous n'avons pas de cours. Ils ont trouvé Java x, x xml. Exception très étrange, non ? Habituellement, lorsqu' une classe n'est pas trouvée, une dépendance est probablement cassée. Et dans ce cas, nous parlons essentiellement de cette dépendance, J XB moins API. ne sais pas vraiment quel est le problème. J'ai découvert que c'était un problème courant sur Internet . Nous allons donc l'ajouter ici pour voir comment cela fonctionne, non ? Alors maintenant, il est dit que nous n'avons aucun identifiant spécifié pour l'entité. Cela signifie donc que nous devons ajouter un identifiant pour cette entité utilisateur. L'identifiant est essentiellement un champ annoté avec l'ID. Donc, dans notre cas, nous devons ajouter cette annotation d' identification, bien sûr, sur la clé primaire. Dans notre cas, nous ne voulons pas nécessairement ajouter, disons qu'un identifiant entier ici pourrait ne pas être utile. Disons que nous pouvons l'essayer FirstName et voir comment cela fonctionne, non ? Comme vous pouvez le constater, les applications ont commencé. Essayons maintenant d'ajouter un utilisateur dans notre application. Nous allons donc passer directement à la méthode Add User à Rio pour utiliser Postman pour ajouter un utilisateur, n'est-ce pas ? Voyons ce qu'il dit. Nous appuyons sur F9, sans exception, nous revenons à zéro également. Cela signifie donc qu'il n'y a pas d'exception à l'application, non ? Nous pouvons donc appuyer sur Sélectionner l'entité utilisateur. Nous pouvons voir que l'utilisateur est sur la base de données, ce qui est bien sûr vraiment génial. Je veux dire, nous avons réussi à ajouter des données dans notre base de données. Ajoutons également un autre utilisateur. Cela semble donc fonctionner comme prévu. Essayons maintenant de récupérer quelques données. Donc celui-ci, on dirait qu'il fonctionne. Si je cherche Daniel, cela semble très bien fonctionner, ce qui est vraiment génial. Je veux dire, oui, supprimons également un utilisateur. Oui, donc sur cette opération, il semblerait que nous ayons un problème, il semblerait que nous ayons une erreur. Donc, cela signifie qu' aucun responsable d'entité ayant une transaction réelle disponible pour le fil actuel ne peut pas traiter de manière fiable pour éliminer le charbon, n'est-ce pas ? Cette erreur nous indique donc que nous n'avons pas cette annotation transactionnelle sur la méthode de suppression. Et c'est un point clé très important que je voulais aborder car l' opération de suppression est généralement très sensible. Je veux dire, vous pouvez réellement l' exécuter à partir de plusieurs threads, disons de plusieurs flux d'exécution car vous risquez de rencontrer des problèmes de concurrence. Vous pouvez donc avoir des problèmes d'incohérence, de conditions de course. Pour les résoudre dans Spring Boot, vous devez utiliser cette annotation transactionnelle, qui nous indique essentiellement que toutes les opérations de cette méthode liées, bien sûr, au référentiel utilisateur seront exécutées. une transaction qui est essentiellement une opération atomique sur la base de données, qui peut réussir ou échouer, mais elle ne peut pas être exécutée de manière partielle, n'est-ce pas ? C'est pourquoi nous avons besoin de cette annotation transactionnelle sur notre méthode afin que l'opération de suppression puisse être exécutée correctement en écriture. Ajoutons donc également un nouvel utilisateur afin que nous puissions voir que cela fonctionne. J'ai supprimé l'utilisateur Markets pour voir si cela fonctionne. Si je supprime, disons l'utilisateur de Daniel, non ? On dirait que nous avons obtenu 204, d'accord, et l'utilisateur est supprimé de notre base de données. Voici donc comment cela fonctionne. Je vais vous laisser résoudre ce problème avec les entités utilisateur. Alors essayez-le, voyez si vous pouvez l'utiliser, vous pouvez le trouver dans la documentation et annotations qui nous permettront de générer un identifiant. Donc, en d'autres termes, vous pouvez, vous pouvez essayer de récupérer ce champ d'identification ici sur la table pour l'ajouter en tant qu'entité utilisateur réservée au champ et voir s'il fonctionne. Voyez si nous pouvons le générer automatiquement à partir de notre application Spring Boot et non à partir de la table. C'est donc essentiellement une façon de jouer et de couvrir des choses. Voyez si cela fonctionne, voyez si cela ne fonctionne pas. Voyez, découvrez pourquoi. C'est ainsi que vous pouvez, vous pouvez apprendre essentiellement toutes ces choses. Il s'agit donc essentiellement d'un moyen très simple d'accéder à une base de données de bout en bout sans trop d'aspects complexes. Comme je l'ai mentionné initialement, étant donné que ce paysage de bases de données et de versions est réellement énorme, vous risquez de rencontrer toutes sortes de problèmes avec les dépendances, les versions, avec des classes qui ne sont pas présentes comme nous l'avons vu précédemment. Attendez-vous donc à ce que ce flux ne soit pas parfait, que ce ne soit pas quelque chose de facile à réaliser. Sur cette base, nous passerons à la prochaine conférence.