Qui la parte precedente dell’articolo: Creare una web application con Spring Boot, MongoDB, Angular 4 e TypeScript e deployarla in cloud come Microsoft Azure Webapp – Parte 7

Finalmente siamo arrivati alla parte in cui introduciamo il database MongoDB, che utilizzeremo per salvare gli utenti nella versione finale dell’applicazione di esempio.

MongoDB è un database NoSQL, cioè non relazionale, che appartiene, più precisamente, alla categoria dei database orientati ai documenti. In questi sistemi, gli oggetti che vengono storicizzati sono chiamati appunto documenti e sono rappresentati sotto forma di documenti JSON (JavaScript Simple Object Notation). In MongoDB, inoltre, tali documenti sono organizzati in Collections. Per qualche informazione introduttiva aggiuntiva su MongoDB, oltre che per un esempio della sua installazione su MacOs, si veda: “Introduzione a MongoDB, parte 1: installazione server e connessione dalla mongo shell”

INSTALLARE ED ESEGUIRE MONGODB IN LOCALE

Supponiamo di utilizzare per lo sviluppo un’istanza di MongoDB in locale sulla macchina e di non averla però ancora disponibile. Per lo sviluppo in locale installeremo una singola istanza standalone, senza preoccuparci di tematiche di ridondanza e alta affidabilità. Quando effettueremo poi il deploy della soluzione sul cloud Microsoft Azure metteremo in piedi un ambiente “di produzione”, configurando un MongoDB Replica Set costituito da 3 macchine.

Se avete un’istanza di MongoDB già disponibile sulla macchina locale potete saltare questa sezione e andare direttamente alla successiva “Connettersi a MongoDB dall’applicazione Spring Boot” più avanti nell’articolo.

Procediamo quindi con la sua installazione, in ambiente Windows in questo caso.

Andiamo sulla pagina “Download” di MongoDB, selezioniamo la versione “Community Version” e scarichiamo il pacchetto di installazione relativo al sistema operativo che stiamo utilizzando. In questo caso sono una macchina Windows a 64 bit, per cui scarico la versione “Windows Server 2008 R2 64-bit and later, with SSL support x64”. Al momento della stesura di questa parte dell’articolo, la “Current Stable Release” di MongoDB è la 3.4.2

Seguiamo il wizard di installazione fino al suo completamento e clicchiamo su “Finish”

La prima cosa da fare una volta terminata l’installazione è creare la cartella in cui MongoDB salverà i dati e i suoi metadati per il nostro database. Di default MongoDB utilizza il path “\data\db” che, se non esiste, deve essere preventivamente creato.

E’ però possibile utilizzare un path differente da quello di default, che dovrà essere specificato in fase di startup del server, per cui decidiamo ad esempio di utilizzare il percorso C:\SpringBootAngularTutorial\db

Creiamo quindi tale cartella: Una volta creata la cartella lanciamo il server di MongoDB, ovvero il processo mongod, specificando di utilizzare la cartella appena creata e indicando la porta su cui dovrà essere in esecuzione. La porta di default di MongoDB è la 27017, ma è possibile specificarne una diversa tramite l’opzione –port del comando mongod.

Decidiamo ad esempio di voler mettere in esecuzione il servizio sulla porta 28000.

Eseguiamo quindi il seguente comando:

mongod --dbpath \SpringBootAngularTutorial\db --port 28000

Una volta lanciato il comando, il server MongoDB inizia a loggare una serie di informazioni relative alla fase di start-up, tra cui anche la versione in esecuzione.

A questo punto il server di MongoDB è running e in attesa di connessioni da parte dei client.

Se andiamo nel path che abbiamo detto a MongoDB di utilizzare per storicizzare i suoi metadati e i dati della nostra applicazione, cioè \SpringBootAngularTutorial\db, possiamo vedere che, a seguito dello startup del server, sono stati creati una serie di file e cartelle di sistema. Non entreremo però nel dettaglio di come sono organizzati e come vengono utilizzati questi file dal server di MongoDB. Al momento non ci interessa scendere così a basso livello.

Per fare invece una rapida prova di connessione possiamo utilizzare uno strumento come MongoChef (ora diventato “Studio 3T”)

Dopo aver installato MongoChef clicchiamo sul pulsante “Connect” in alto a sinistra e poi nella finestra che si apre scegliamo “New Connection”. Siccome stiamo utilizzando un MongoDB che gira localmente sulla macchina, inseriamo “localhost” come server e indichiamo poi la porta su cui abbiamo messo in ascolto il processo, cioè la 28000.

Proviamo a fare un test di raggiungibilità del database tramite il pulsante “Test Connection” e, se abbiamo eseguito correttamente la configurazione, otteniamo un riscontro positivo e un risultato come quello mostrato nella figura seguente:

Una volta verificato che il test va a buon fine, clicchiamo su “Save” per salvare la configurazione della nuova connessione e poi su “Connect”. Siamo quindi connessi con MongoChef al nostro database MongoDB installato in locale.

CONNETTERSI A MONGODB DALL’APPLICAZIONE SPRING BOOT

Ora che abbiamo il nostro database MongoDB in esecuzione e che abbiamo verificato che lo raggiungiamo correttamente tramite il client MongoChef, è ora di provare a connetterci ad esso dalla nostra applicazione Spring Boot.

Per farlo ci basta inserire gli estremi di connessione al database all’interno del nostro file di configurazione dell’applicazione “application.properties” che troviamo sotto src/main/resources.

Spring Tool Suite fornisce una funzionalità di intellisense che mostra le proprietà disponibili per la valorizzazione in “application-properties” facendo autocomplete di quanto abbiamo digitato. Se quindi digitiamo “mongo.” ci viene suggerita una lista di properties disponibili, in questo caso in gran parte relative al modulo Spring-Data.

Valorizziamo ora la proprietà spring.data.mongodb.uri indicando:

il prefisso mongodb:

l’ host , quindi localhost in questo caso perché stiamo eseguendo MongoDB in locale

, quindi localhost in questo caso perché stiamo eseguendo MongoDB in locale la porta , quindi 28000 nel nostro caso

, quindi 28000 nel nostro caso il nome del database, ad esempio “tutorialDB”

La stringa completa di assegnazione del valore alla proprietà risulta quindi:

spring.data.mongodb.uri=mongodb://localhost:28000/tutorialDB

Il database non deve necessariamente essere già esistente; nel caso un database con questo nome non esista, esso verrà creato non appena andremo ad inserire un documento all’interno di una collection.

Torniamo ora nel file POM del progetto e decommentiamo la dipendenza dello starter Data MongoDB di Spring Boot, che avevamo provvisoriamente commentato nella parte 2 del tutorial

A questo punto proviamo a lanciare il progetto Spring Boot per vedere se l’applicazione si connette al database MongoDB. Come possiamo vedere dallo screeshot sottostante, mentre prima ottenevamo una “MongoSocketOpenException”, ora l’applicazione Spring Boot di back-end si connette correttamente all’istanza MongoDB.



org.mongodb.driver.cluster: Cluster created with settings {hosts=[localhost:28000], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500} org.mongodb.driver.connection: Opened connection [connectionId{localValue:1, serverValue:7}] to localhost:28000 org.mongodb.driver.cluster: Monitor thread successfully connected to server with description ServerDescription{address=localhost:28000, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 2]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=681206}

Se torniamo nella shell in cui avevamo lanciato il comando mongodb e che avevamo lasciato con il log del server che diceva di essere in attesa di connessioni, vediamo che compare l’informazione relativa all’accettazione della connessione proveniente dalla nostra applicazione Spring Boot, arricchita da un po’ di dettagli sulle caratteristiche del client che si è connesso.

Bene, ci siamo connessi al database MongoDB dall’applicazione Spring Boot.

L’unica cosa a cui fare attenzione è il fatto che se omettiamo il nome del database e valorizziamo la proprietà “spring.data.mongodb.uri” solo con server e porta otteniamo il seguente errore:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoDbFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.mongodb.core.SimpleMongoDbFactory]: Factory method 'mongoDbFactory' threw exception; nested exception is java.lang.IllegalArgumentException: Database name must not be empty!

Vai alla parte successiva dell’articolo: Creare una web application con Spring Boot, MongoDB, Angular 4 e TypeScript e deployarla in cloud come Microsoft Azure Webapp – Parte 9