我有一个REST应用程序,可从数据库存储库读取。
我想添加一个命令行应用程序,该应用程序读取CSV并将数据导入数据库。
如果我向项目/ jar添加另一个实现@SpringBootApplication
的{{1}}类,Spring将在与我的主服务器同时启动它。
如果我添加一个用于初始化spring上下文本身的类,则JPARepository上的jdbc url将使用默认值,而不是spring引导属性中的默认值
CommandLineRunner
有更好的方法吗?
答案 0 :(得分:0)
要执行此操作,需要执行几个步骤。
第一件事是@SpringBootApplication
自动扫描其下的所有程序包,并将自动启动找到的所有CommandLineRunner,因此命令行应用程序需要位于并行程序包中。
例如
- com
- test
- rest
- model
- repository
- controller
#RestSpringBoot.java
- Commands
#ImportCsv.java
接下来的事情是,由于命令行应用程序位于并行包中,因此您需要自行指定扫描内容。
这包括三个部分:
第一个确保创建了Bean,第二个确保了创建了休眠实体,第三个确保了正确生成了JPA类。
最后一部分是禁用Spring Boot Web服务器的启动,否则您将遇到端口冲突。
这最终以:
@SpringBootApplication
@ComponentScan(basePackageClasses = {Repository.class})
@EntityScan(basePackageClasses = {MyEntity.class})
@EnableJpaRepositories(basePackageClasses = {Repository.class})
public class CsvImport {
@Autowired
private RiskRepository repository;
public static void main(String[] args) {
SpringApplication app = new SpringApplication(CsvImport.class);
app.setBannerMode(Banner.Mode.OFF);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
@Override
public void run(String... args) throws Exception {
File file = new File(args[0]);
if (file.isFile()) {
importCsv(file);
}
}
private void importCsv(File file) {
....
....