我有一个使用Mongodb的Spring Boot项目。所以,在我的pom中我有这种依赖性:
{{1}}
所以我可以使用此存储库类访问数据库:
{{1}}
我需要在Mongodb数据库中对我的数据进行初始化,例如使用默认角色。 Spring Boot框架中最好的方法是什么?
答案 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();
}
}
当然,您必须检查集合不存在,以便在数据库已经创建的情况下不创建集合。