春季Mongo填充器一个接一个 [英] Spring Mongo Populator one by one
问题描述
我在Kotlin上使用MongoDB和Spring,我希望我的应用程序在启动时填充MongoDB集合. (并在每次启动时对其进行清洁)
I'm using MongoDB and Spring over Kotlin and i want my application to populate a MongoDB collection upon startup. (and clean it every time it starts)
我的问题是,如果要填充的某些数据有问题,我如何才能逐个填充数据以容错?
My question is, how can i populate the data one by one in order to be fault tolerant in case some of the data I'm populating with is problematic?
我的代码:
@Configuration
class IndicatorPopulator {
@Value("classpath:indicatorData.json")
private lateinit var data: Resource
@Autowired
private lateinit var indicatorRepository: IndicatorRepository
@Bean
@Autowired
fun repositoryPopulator(objectMapper: ObjectMapper): Jackson2RepositoryPopulatorFactoryBean {
val factory = Jackson2RepositoryPopulatorFactoryBean()
indicatorRepository.deleteAll()
factory.setMapper(objectMapper)
factory.setResources(arrayOf(data))
return factory
}
我正在寻找的东西是这样的:
What I am looking for is something like:
@Bean
@Autowired
fun repositoryPopulator(objectMapper: ObjectMapper): Jackson2RepositoryPopulatorFactoryBean {
val factory = Jackson2RepositoryPopulatorFactoryBean()
indicatorRepository.deleteAll()
factory.setMapper(objectMapper)
val arrayOfResources: Array<Resource> = arrayOf(data)
for (resource in arrayOfResources){
try{
factory.setResources(resource)
} catch(e: Exception){
logger.log(e.message)
}
}
return factory
}
关于如何执行类似操作的任何想法都将有所帮助... 预先感谢.
Any idea on how to do something like that would be helpful... Thanks in advance.
推荐答案
您的请求没有内置的支持,但是您可以通过调整几个类轻松地提供它.
There is no built in support for your ask but you can easily provide by tweaking few classes.
添加自定义Jackson 2阅读器
Add Custom Jackson 2 Reader
public class CustomJackson2ResourceReader implements ResourceReader {
private static final Logger logger = LoggerFactory.getLogger(CustomJackson2ResourceReader.class);
private final Jackson2ResourceReader resourceReader = new Jackson2ResourceReader();
@Override
public Object readFrom(Resource resource, ClassLoader classLoader) throws Exception {
Object result;
try {
result = resourceReader.readFrom(resource, classLoader);
} catch(Exception e) {
logger.warn("Can't read from resource", e);
return Collections.EMPTY_LIST;
}
return result;
}
}
添加自定义Jackson 2填充器
Add Custom Jackson 2 Populator
public class CustomJackson2RepositoryPopulatorFactoryBean extends Jackson2RepositoryPopulatorFactoryBean {
@Override
protected ResourceReader getResourceReader() {
return new CustomJackson2ResourceReader();
}
}
配置
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public AbstractRepositoryPopulatorFactoryBean repositoryPopulator(ObjectMapper objectMapper, KeyValueRepository keyValueRepository) {
Jackson2RepositoryPopulatorFactoryBean factory = new CustomJackson2RepositoryPopulatorFactoryBean();
keyValueRepository.deleteAll();
factory.setMapper(objectMapper);
factory.setResources(new Resource[]{new ClassPathResource("badclassname.json"), new ClassPathResource("good.json"), new ClassPathResource("malformatted.json")});
return factory;
}
}
我已经在此处上传了工作示例
I've uploading a working example here
这篇关于春季Mongo填充器一个接一个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!