Mongodb的Spring Boot和Database默认数据

时间:2017-07-18 09:50:40

标签: java spring mongodb spring-boot

我有一个使用Mongodb的Spring Boot项目。所以,在我的pom中我有这种依赖性:

{{1}}

所以我可以使用此存储库类访问数据库:

{{1}}

我需要在Mongodb数据库中对我的数据进行初始化,例如使用默认角色。 Spring Boot框架中最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点,我建议您使用CommandlineRunner

尝试:

@Bean
public CommandLineRunner initConfig(MyRepo repo) {
  if (data not exist) {
      repo.save(...);
  }

}

否则您可以使用@PostConstruct启动它..

如果你需要像liquibase这样的RDBMS,请结帐mongobee:https://github.com/mongobee/mongobee

答案 1 :(得分:0)

正如@ Jaiwo99所说,我明白没有标准可以做到这一点。所以我决定使用Spring Batch。我从我的应用程序的CSV文件角色和权限中实现了一个加载批处理。

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public MongoTemplate mongoTemplate;

@Bean
public PlatformTransactionManager transactionManager() {
    return new ResourcelessTransactionManager();
}

@Bean
public Tasklet defaultRolePermissionTasklet() {
    return new DefaultRolePermissionTasklet();
}


public <T> FlatFileItemReader<T> readerFile(String fileName,String[] fields,Class<T> type)  {

    FlatFileItemReader<T> reader = new FlatFileItemReader<T>();
    reader.setStrict(false);
    reader.setResource(new ClassPathResource(fileName));
    reader.setLineMapper(new DefaultLineMapper<T>() {
        {
            setLineTokenizer(new DelimitedLineTokenizer() {
                {
                    setNames(fields);
                    setStrict(false);
                }
            });
            setFieldSetMapper(new BeanWrapperFieldSetMapper<T>() {
                {
                    setTargetType(type);
                }
            });
        }
    });
    return reader;

}

@Bean
public PermissionItemProcessor permissionProcessor() {
    return new PermissionItemProcessor();
}

@Bean
public RoleItemProcessor roleProcessor() {
    return new RoleItemProcessor();
}

@Bean
public Job initAuthenticationData(JobCompletionNotificationListener listener) {
    return jobBuilderFactory.get("initAuthenticationData").incrementer(new RunIdIncrementer()).listener(listener)
            .start(stepPermission())
            .next(stepRole())
            .next(stepDefaultRolePermissions())
            .build();
}

@Bean
public Step stepDefaultRolePermissions() {
    return stepBuilderFactory.get("stepDefaultRolePermissions").tasklet(defaultRolePermissionTasklet()).build();
}


@Bean
public Step stepPermission() {

    MongoItemWriter<Permission> writer = new MongoItemWriter<Permission>();
    writer.setTemplate(mongoTemplate);




    return stepBuilderFactory.get("stepPermission").<Permission, Permission>chunk(20)
            .reader(readerFile("permission-data.csv",new String[] {"name","description"},Permission.class))
            .processor(permissionProcessor())
            .writer(writer)
            .build();
}

@Bean
public Step stepRole() {
    MongoItemWriter<Role> writer = new MongoItemWriter<Role>();
    writer.setTemplate(mongoTemplate);

    return stepBuilderFactory.get("stepRole").<Role, Role>chunk(20)
            .reader(readerFile("role-data.csv",new String[] {"name","description"},Role.class))
            .processor(roleProcessor())
            .writer(writer)
            .build();
    }
}

答案 2 :(得分:0)

至少,还有一种方法可以使用 Spring Boot 在 Mongodb 中初始化数据。您可以像这样在您的配置中创建:

@Configuration
public class AppConfiguration {

    @Autowired
    public void prepare(ReactiveMongoOperations mongoOperations,
                        UserRepository userRepository) {
        mongoOperations.createCollection("users",
                CollectionOptions.empty()
                        .maxDocuments(1_000)
                        .size(1024 * 8)
                        .capped()).block();
        userRepository
                .insert(List.of(
                        User.builder()
                                .name("Joe Doe")
                                .build()
                ))
                .blockLast();
    }
}

当然,您必须检查集合不存在,以便在数据库已经创建的情况下不创建集合。