Spring Boot con Spring Data MongoDB

TeselaDB

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 con readWrite sobre la base shop.
  • La cadena de conexión en la variable de entorno TESELADB_URI, con tls=true y sin tlsCAFile.

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:

Shell
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 orders

2. 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=teseladb

3. 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:

Java
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) {}
Java
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);
}
Java
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:

Shell
./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

JavaScript
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.

Siguientes pasos

  • Java, con el driver de Java sin Spring.
  • ODM y ORM, con Mongoose y Beanie.