6. Spring Data MongoDB i API REST
Com sabem, el projecte Spring Data, inclòs a la plataforma Spring, proporciona un marc per simplificar l'accés i la persistència de dades en diferents repositoris d'informació. Dins d'aquest projecte hi ha Spring Data MongoDB, que proporciona integració amb bases de dades MongoDB, a través d'un model centrat en POJOs que interactuen amb col·leccions de documents i proporciona un repositori d'accés a dades.
En aquesta secció, i continuant amb la unitat anterior, abordarem el desenvolupament de components d'accés a dades a través de Spring Data, així com microserveis que ofereixen aquestes dades a través d'una API REST, tot això seguint el patró MVC que ja coneixem.
6.1. Definint el Model – Document
Una base de dades MongoDB està composta per col·leccions de Document. Tot i que aquests Documents poden tenir estructures diferents entre si o diferents tipus de dades, el model requereix una estructura estàtica. Així doncs, el primer que hem de fer és crear una classe que representi aquest Document Principal per a MongoDB, que serà el que es retornarà per les consultes que es facin.
En aquest context, hi ha dues anotacions principals que utilitzarem:
@Document→ per indicar que una classe correspon a un objecte de domini (domain object) que es pot mapar a la base de dades per oferir persistència. Aquesta anotació per a MongoDB seria l'equivalent a@Entityen JPA. Si no s'indica res, el nom de la col·lecció que s'utilitzarà s'interpretarà com a corresponent al nom de la classe en minúscules. Així, si tenim la classecom.jaume.ad.Person, s'utilitzarà la col·leccióperson. No obstant això, podem indicar la col·lecció amb la qual estem treballant, ja sigui a través dels atributs value o collection, amb la següent sintaxi:@Document(value="collection")@Document("collection")@Document(collection="collection")
@IdS'aplica a un camp, i s'utilitza per indicar que el camp s'utilitzarà com a identificador. Com sabem, cada document a MongoDB requereix un identificador. Si no se'n proporciona cap, el controlador assignarà unObjectIDautomàticament. És important tenir en compte que els tipus de dades que podem utilitzar com a identificadors poden ser tantStringscomBigInteger, ja que Spring s'encarregarà de convertir-los al tipus ObjectID.
Important
| Text Only | |
|---|---|
1 | |
A més d'aquestes, hi ha altres anotacions més específiques que podem utilitzar. Si ho desitgeu, podeu consultar-les a la documentació de referència de Spring Data MongoDB aquí.
6.2. Definint el Repositori
Com sabem, el repositori és la interfície encarregada de gestionar l'accés a les dades. En el cas de MongoDB, aquest derivarà de MongoRepository, que serà una interfície parametritzada per dos arguments:
MongoRepository<T, Id>, on:T→ El tipus de document, que correspondrà a la classe definida al model, iId→ El tipus de dada al qual pertanyerà l'identificador.
La interfície MongoRepository, com hem dit, serà específica per a MongoDB, i derivarà de les interfícies CrudRepository i PagingAndSortingRepository, de les quals heretarà tots els seus mètodes. D'aquesta manera, al repositori només haurem de declarar aquells mètodes que siguin més específics per a la nostra aplicació, ja que tots els mètodes per implementar operacions CRUD, així com findAll() i findById() seran heretats de MongoRepository.
Per definir les nostres pròpies consultes al repositori, utilitzarem l'anotació @Query, proporcionant la consulta en qüestió com a valor:
| Java | |
|---|---|
Per subministrar paràmetres a la consulta, aquests es reben com a arguments del mètode, i es referencien pel seu ordre a la consulta: ?0 per al primer argument, ?1 per al segon, etc. Potser en versions més noves es poden utilitzar paràmetres de manera nominal, com :parameter_name.
6.3. Definint el servei
Els serveis s'encarreguen de la capa de negoci de la nostra aplicació, i accedeixen a les dades a través del repositori, enviant els resultats al controlador. Aquests serveis, en general, es caracteritzen per:
- Utilitzar les anotacions
@Service, per indicar a Spring que s'està implementant un servei - D'una banda, es defineix la interfície del Servei i, d'altra banda, es realitza la implementació a través de la classe
ServiceImpl. - S'utilitza l'anotació
@Autowireden referències a repositoris per enllaçar o injectar el servei en qüestió amb aquest repositori. - Un cop obté les dades del repositori, les envia al controlador.
6.4. Definint el controlador
Finalment, ens queda la implementació del controlador, que ja coneixem de Spring. Recordem les característiques principals d'aquest:
- Utilitzar l'anotació
@RestControllera nivell de classe per indicar que es tracta d'un controlador REST - Utilitzar l'anotació
@RequestMappinga nivell de classe per especificar el camí base per als punts finals del servei, - Utilitzar l'anotació
@Autowireda les propietats que fan referència al servei, per injectar-lo automàticament, - Utilitzar les anotacions
@GetMapping,@PostMapping,@PutMapping,@DeleteMappingals mètodes que implementaran sol·licituds de tipus GET, POST, PUT o DELETE, especificant el seu Endpoint. - Utilitzar les anotacions
@PathVariableo@RequestParamo@RequestBodyals arguments dels mètodes anteriors per obtenir els valors del camí, sol·licitud o cos.
2. Swagger
Fins ara, estem provant la nostra API REST amb Postman, però ara oferim una eina que s'integra amb Spring i Tomcat per provar la nostra API de manera ràpida i senzilla.
Swagger (https://swagger.io) és molt senzill de començar:
- Afegir dependències.
- Afegir una classe de configuració, que escaneja els nostres controladors per trobar quins punts d'entrada estan definits.
- Crear automàticament una interfície d'usuari, que mostra quins punts d'entrada estan definits i eines per provar-los.
2.1. Dependència
Has d'afegir al teu pom.xml:
| XML | |
|---|---|
2.2. Classe de configuració
Necessitem crear una classe com aquesta:
Cal implementar dos mètodes:
Docket apiDocket()→ que crea unDocket. AquestDocketconté referències per treballar i provar la nostra APIApiInfo getApiInfo()→ que crea unApiInfo, i com el seu nom indica, és informació bàsica sobre per a què s'ha creat aquesta API.
Atenció
| Text Only | |
|---|---|
1 | |
2.3. Proves
Quan el nostre projecte Spring s'inicia, podem veure la informació del registre:
| Text Only | |
|---|---|
Això significa que tenim un nou punt d'entrada /v2/api-docs. Si provem aquest punt d'entrada, obtenim alguna cosa així:
És un document JSON que descriu la nostra API. Però per treballar de manera còmoda, podem sol·licitar /swagger-ui.html, i obtenim:
Aquesta pàgina d'interfície d'usuari conté la informació bàsica que hem establert al mètode getApiInfo(). A la part inferior podem veure més elements. Si obrim, obtenim:
Podem veure informació sobre els punts d'entrada i els models que retorna l'API. A més, podem entrar a cada punt d'entrada per obtenir informació sobre els paràmetres, i finalment executar-lo.
3. Apèndix. Solució a l'exercici sobre consultes mongo
- Obteniu totes les produccions que es van estrenar el
2015o són del tipusseries.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Obteniu totes les pel·lícules NO estrenades entre els anys
2000i2002.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Obteniu totes les pel·lícules per a les quals la clau "directors" no està definida.
Consell
| Text Only | |
|---|---|
1 | |
- Obteniu el títol de totes les pel·lícules que comencen amb la cadena
star wars, independentment de majúscules.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Obteniu el títol de totes les pel·lícules que contenen el gènere comèdia (
Comedy).
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Mostreu el títol i els gèneres de les pel·lícules que contenen el gènere comèdia (
Comedy) o aventura (Adventure).
Consell
| Text Only | |
|---|---|
1 | |
- Obteniu el títol i els gèneres de les pel·lícules que tenen tres gèneres.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Obteniu les pel·lícules amb una qualificació de
Rotten Tomatoessuperior a4.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Feu la mateixa consulta que abans, però limitant el nombre de documents a 10.
Consell
| Text Only | |
|---|---|
1 | |
| JavaScript | |
|---|---|
- Ara mostreu el títol i la qualificació d'aquestes pel·lícules amb una qualificació superior a 4, ordenades per qualificació (de més alta a més baixa) i limitant els resultats a 10.
Consell
| Text Only | |
|---|---|
1 | |