Java 如何将命令行应用程序添加到Spring Boot Rest应用程序
我有一个从数据库存储库读取的REST应用程序 我想添加一个命令行应用程序,用于读取CSV并将数据导入数据库 如果我将另一个实现Java 如何将命令行应用程序添加到Spring Boot Rest应用程序,java,spring-boot,Java,Spring Boot,我有一个从数据库存储库读取的REST应用程序 我想添加一个命令行应用程序,用于读取CSV并将数据导入数据库 如果我将另一个实现CommandLineRunner的@SpringBootApplication类添加到项目/jar中,Spring会在启动主服务器的同时启动它 如果我添加一个初始化spring上下文本身的类,那么JPARepository上的JDBCURL将使用默认值,而不是spring引导属性中的默认值 spring.datasource.url=jdbc:h2:file:./tes
CommandLineRunner
的@SpringBootApplication
类添加到项目/jar中,Spring会在启动主服务器的同时启动它
如果我添加一个初始化spring上下文本身的类,那么JPARepository上的JDBCURL将使用默认值,而不是spring引导属性中的默认值
spring.datasource.url=jdbc:h2:file:./test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE
@ComponentScan(basePackages = "com.test")
public class CsvImport {
@Autowired
private Repository repository;
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CsvImport.class);
context.start();
CsvImport csvImport = context.getBean(CsvImport.class);
File file = new File(args[0]);
if (file.isFile()) {
csvImport.importCsv(file);
}
context.stop();
}
private void importCsv(File file) {
....
....
有更好的方法吗?要使其正常工作,需要几个步骤 第一件事是
@springbootplication
自动扫描它下面的任何包,并自动启动它找到的任何CommandLineRunner,因此命令行应用程序需要在一个并行包中
e、 g
下一件事是,由于命令行应用程序位于并行包中,因此您需要自己指定扫描
这有三个部分:
- @组件扫描
- @实体扫描
- @授权代理
@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) {
....
....
如果您创建一个类似bean的文件并将CSV文件内容加载到一个服务中,然后请求该内容并将其放入数据库(然后删除服务中的内容,从而实现内存)。。。这样对你会更好吗?看起来有点复杂。我觉得我要么需要一种方法从主应用程序委托给不同的spring启动应用程序,要么需要将spring.datasource.url属性加载到一个经典的spring应用程序中,就像问题中的类一样。
@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) {
....
....