Spring Boot con Spring Data MongoDB
TeselaDB
Equipo de TeselaDB
35 minIntermedio
Una API de pedidos con Spring Boot 4 y un repositorio de Spring Data que guarda en TeselaDB con TLS.
Spring Data MongoDB habla con la base a través del driver oficial de Java, así que tus documentos y tus repositorios funcionan con TeselaDB sin cambios. Aquí montas una API de pedidos y la conectas al clúster con TLS.
Lo que vas a construir
Una aplicación de Spring Boot 4 con un documento Order, un repositorio con una consulta derivada y un controlador con
POST /orders, GET /orders/{id} y GET /orders?customer=.
Requisitos
- Java 21 o posterior.
- Un clúster de TeselaDB, su CA (
pki/ca.pem) y un usuario conreadWritesobre la baseshop. - La cadena de conexión en la variable de entorno
TESELADB_URI, contls=truey sintlsCAFile.
1. Crea el proyecto
Genera un proyecto Maven para Java 21 con los módulos web y Spring Data MongoDB desde start.spring.io, y descomprímelo en
la carpeta orders:
curl -s https://start.spring.io/starter.zip -d dependencies=web,data-mongodb -d type=maven-project \
-d javaVersion=21 -d groupId=com.example -d artifactId=orders -o orders.zip
unzip orders.zip -d orders && cd orders2. Conéctalo a TeselaDB
En src/main/resources/application.properties. La CA del clúster va en un paquete SSL de Spring Boot, que el cliente
de MongoDB usa como almacén de confianza. En Spring Boot 3, la propiedad de la cadena es spring.data.mongodb.uri:
spring.mongodb.uri=${TESELADB_URI}
spring.ssl.bundle.pem.teseladb.truststore.certificate=file:./ca.pem
spring.mongodb.ssl.bundle=teseladb3. Escribe el documento, el repositorio y el controlador
En src/main/java/com/example/orders/. Spring Data genera la consulta de findByCustomer a partir de su nombre:
package com.example.orders;
import java.time.Instant;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document("orders")
public record Order(@Id String id, String customer, double total, Instant createdAt) {}package com.example.orders;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface OrderRepository extends MongoRepository<Order, String> {
List<Order> findByCustomer(String customer);
}package com.example.orders;
import java.time.Instant;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/orders")
public class OrderController {
private final OrderRepository orders;
public OrderController(OrderRepository orders) {
this.orders = orders;
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Order create(@RequestBody Order order) {
return orders.save(new Order(null, order.customer(), order.total(), Instant.now()));
}
@GetMapping("/{id}")
public ResponseEntity<Order> read(@PathVariable String id) {
return ResponseEntity.of(orders.findById(id));
}
@GetMapping
public List<Order> byCustomer(@RequestParam String customer) {
return orders.findByCustomer(customer);
}
}Probarlo
Arranca la aplicación con ./mvnw spring-boot:run. Después, en otra terminal, crea un pedido de Ana con un total de 30
y búscalo por su cliente con la ruta GET /orders?customer=, que lanza la consulta derivada de findByCustomer del repositorio:
./mvnw spring-boot:run
curl -s -X POST localhost:8080/orders -H "content-type: application/json" -d '{"customer":"Ana","total":30}'
curl -s "localhost:8080/orders?customer=Ana"La segunda orden devuelve una lista con el pedido de Ana, con su id y su fecha de creación.
Limpiar
db.getSiblingDB("shop").orders.deleteMany({ customer: "Ana" });Para la aplicación con Ctrl+C y ejecuta esta orden en mongosh para borrar los pedidos de prueba, todos con Ana como
cliente.