Crear Proyecto Spring Boot con MongoDB

De ChuWiki


Spring Initializr[editar]

Spring Initializr es una web de Spring Boot que nos permite seleccionar qué tipo de proyecto Spring Boot queremos, qué dependencias, nombre del proyecto, etc, etc. Una vez relleno el formulario, nos podemos descargar un zip con el esqueleto de nuestro proyecto completo ya montado. Solo desempaquetarlo en nuestro ordenador y montarlo en nuestro IDE favorito.

Vamos a usarlo para montar un proyecto con Spring Boot, MongoDB y Maven

Proyecto Maven con Spring Boot y MongoDB[editar]

En la siguiente imagen ves la pantalla de Spring Initializr ya rellena con los datos para nuestro proyecto. No obstante, comentamos lo más importante

Creación de proyecto Spring Boot con MongoDB
Creación de proyecto Spring Boot con MongoDB
  • Eliges el tipo de proyecto que quieres, en nuestro caso es Maven.
  • Eliges el lenguaje de programación que quieras usar. En nuestro caso, Java.
  • Eliges la versión de Spring Boot. En nuestro caso la 3.14 que es la última estable.
  • Rellenas los campos relativos a tu proyecto como groupId y artifactId de Maven, nombre del proyecto, una descripción y el paquete a partir del cual estarán tus clases
  • Eliges si quieres que el proyecto genere un jar (ejecutable java no web) o un war (módulo java para desplegar en un contenedor de aplicaciones). En nuestro caso elegiremos jar.
  • Eliges la versión de Java. Independientemnte de la que pongas aquí, tiene que tener instalado y usar para el proyecto al menos Java 17. Las versiones modernas de Spring Boot no funcionan con versiones anteriores.
  • Finalmente, en el lado derecho, arriba, pulsas "add dependencies" y en la lista que aparece, seleccionas Spring Data MongoDB. Esto añadirá la dependencia de spring-boot-starter-data-mongodb a nuestro proyecto.

Y todo listo. Simplemente pulsar Generate en la parte de abajo para que cree el zip con nuestro proyecto y lo descargue.

Fichero pom.xml de Spring Boot con MongoDB[editar]

A continuación, el fichero pom.xml de Maven que nos ha generado Spring Initializr

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.1.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.chuidiang.examples</groupId>
	<artifactId>spring-boot-mongodb-example</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-boot-mongodb-example</name>
	<description>Ejemplo de mongodb con Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

Algunos puntos a destacar:

  • Le pone como parent de proyecto Maven a spring-boot-starter-parent. Si necesitas que tu proyecto no tenga ese padre porque necesitas ponerle otro o poque simplemente no te gusta, aquí puedes ver cómo cambiar el parent spring-boot-starter-parent de un proyecto Spring Boot
  • Verás que aparece como groupId, artifactId, nombre, descripción y packaging de tu proyecto lo que rellenaste en la web de Spring Initializr
  • Versión de Java que indicaste
  • Dos depencencias:
    • spring-boot-starter-data-mongodb para tener un proyecto Spring Boot que utilice MongoDB
    • spring-boot-starter-test para test. Esta viene siempre por defecto.
  • Y un plugin, spring-boot-maven-plugin, que ayuda a generar correctamente el jar de nuestro proyecto usando Spring Boot

Test de Spring Boot y MongoDB[editar]

Si miras las clases que genera, verás que genera una clase principal en tu proyecto y una de test. Las pongo a continuación


@SpringBootApplication
public class SpringBootMongodbExampleApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootMongodbExampleApplication.class, args);
	}
}
@SpringBootTest
class SpringBootMongodbExampleApplicationTests {
	@Test
	void contextLoads() {
	}
}

No hacen nada, salvo arrancar la aplicación y terminar. Puedes borrarlas o usarlas como base para empezar a construir tu aplicación.

Hay sin embargo un detalle que conviene saber. Si en Initializr elegimos una versión de Spring Boot por debajo de la 3.0.0 e igual o superior a la 2.6.0, tenemos posilbidad de añadir como dependencia una embedded MongoDB Database. Esto nos permite usar una base de datos MongoDB en nuestra aplicación Spring Boot para tests.

Parámetros de conexión de Spring Boot con MongoDB en application.properties[editar]

Por defecto, nuestro proyecto Spring Boot con MongoDB intentará conectar con una base de datos MongoDB en localhost y puerto 27017 por defecto. Sin autentificación de usuario y password. Y la conexión será contra una base de datos de nombre "test" dentro de nuestro servidor de MongoDB. Si lo tenemo así, estupendo. Si no, hay que cambiarlo.

Spring Initializr genera también un fichero application.properties, vacío, en nuestro proyecto. Ahí podemos poner las propiedades de MongoDB para la conexión

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=chuidiang-test
spring.data.mongodb.username=admin
spring.data.mongodb.password=password

Puedes poner sólo las que cambien respecto a la configuración por defecto. Puedes no poner, o dejar comentadas, las que no cambien. Si no pones las propiedades spring.data.mongodb.username y spring.data.mongodb.password, no se pasará usuario y password a MongoDB, que tiene entonces que estar configurado para admitir conexiones sin autentificación de usuario y password.