MTITEK.com
Spring Framework / Spring MongoDB

Spring MongoDB

This project uses Spring Data MongoDB to persist documents in MongoDB. spring-boot-starter-data-mongodb autoconfigures a MongoClient and a MongoTemplate; repositories are proxy-generated at runtime from CrudRepository interfaces — no boilerplate DAO code. An embedded MongoDB instance (Flapdoodle) is included on the classpath, allowing the app to run without a local MongoDB installation.

Maven Dependencies

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <version>4.24.0</version>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo.spring4x</artifactId>
    <version>4.24.0</version>
</dependency>

Configuration

spring.mongodb.host=localhost
spring.mongodb.port=27017
spring.mongodb.database=mtitek-spring-mongodb

de.flapdoodle.mongodb.embedded.version=7.0.2

Document Mapping

AppProfile

@Document(collection = "appProfiles")
@Data
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class AppProfile {
    @Id
    private String id;
    private String name;
    private Role role;

    public enum Role {
        USER, ADMIN, SUPPORT;
    }
}

AppUser

@Document(collection = "appUsers")
@Data
@AllArgsConstructor
@NoArgsConstructor(force = true)
public class AppUser {
    @Id
    private String id;

    @NotNull
    @Size(min = 3, message = "Name must be at least 3 characters long")
    private String name;

    @Size(min = 1, message = "You must choose at least 1 appProfile")
    private List<AppProfile> appProfiles = new ArrayList<>();

    public void addAppProfile(AppProfile appProfile) {
        this.appProfiles.add(appProfile);
    }
}

Repositories

public interface AppProfileRepository extends CrudRepository<AppProfile, String> {}
public interface AppUserRepository extends CrudRepository<AppUser, String> {}

Data Initialization

@Bean
public CommandLineRunner saveAppProfiles(AppProfileRepository repo) {
    return new CommandLineRunner() {
        @Override
        public void run(String... args) throws Exception {
            repo.save(new AppProfile("1", "AppProfile 1 USER", Role.USER));
            repo.save(new AppProfile("2", "AppProfile 2 ADMIN", Role.ADMIN));
            repo.save(new AppProfile("3", "AppProfile 3 SUPPORT", Role.SUPPORT));
        }
    };
}

Controllers

AppProfileController

AppUserController

Thymeleaf Templates