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.