gpt4 book ai didi

java - Spring Boot 在作为 Servlet 运行时可以连接到 Cassandra,但不能作为命令行运行

转载 作者:行者123 更新时间:2023-12-01 21:53:12 29 4
gpt4 key购买 nike

背景:我正在尝试为我们的 Cassandra 数据库建立一个基于代码的数据迁移系统。我没有丰富的 Java 经验,但如果这是一个 .NET 项目,我会在同一解决方案下将迁移设置为不同的项目。但是,根据其他更有经验的团队成员的指导,建议我将迁移包含在与应用程序的其余部分相同的包中(我对此很满意)。还有人建议,最简单的方法是通过 Web API 端点运行迁移(我对此持怀疑态度)。为了避免出现潜在的安全漏洞,我想尝试制作一个命令行实用程序来执行迁移。

<小时/>

我有一个 Spring Boot Web 应用程序,其入口点类如下所示:

@Configuration
@SpringBootApplication
@EnableAutoConfiguration
@EnableCaching
@EnableScheduling
public class MyApplication extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}

public static void main(String[] args) {
new MyApplication().configure(new SpringApplicationBuilder(MyApplication.class)).run(args);
}
}

但是,我正在尝试添加功能来通过命令行运行与此应用程序一起打包的几个迁移脚本(例如 java -jar MyApplication.jar migrate ),因此我添加了以下类:

@Configuration
@SpringBootApplication
@EnableAutoConfiguration
public class MigrationRunner implements CommandLineRunner {

@Autowired
Session session;

@Override
public void run(String[] args)
{
MigrationResources mr = new MigrationResources();
mr.addMigration(...);
mr.addMigration(...);

MigrationEngine.withSession(session).migrate(mr);
}
}

然后更新我的入口点类,如下所示:

// annotations
public class MyApplication extends SpringBootServletInitializer {

private final static String MIGRATE_COMMAND = "migrate";

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}

public static void main(String[] args) {
if (args.length > 0 && args[0].equalsIgnoreCase(MIGRATE_COMMAND)) {
new SpringApplicationBuilder()
.sources(MigrationRunner.class)
.run(Arrays.copyOfRange(args, 1, args.length));
} else {
new MyApplication().configure(new SpringApplicationBuilder(MyApplication.class)).run(args);
}
}
}

问题是当我使用 migrate 执行此操作时arg,Spring 抛出此错误:

Error creating bean with name 'migrationRunner': Unsatisfied dependency expressed through field 'session'

Error creating bean with name 'session' defined in class path resource [org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.class]: Invocation of init method failed

All host(s) tried for query failed (tried: server022/XX.YY.ZZ.022:9042 (com.datastax.driver.core.exceptions.TransportException: [server022/XX.YY.ZZ.022:9042] Connection has been closed), server022/XX.YY.ZZ.020:9042 (com.datastax.driver.core.exceptions.TransportException: [server020/XX.YY.ZZ.020:9042] Connection has been closed), server020/XX.YY.ZZ.021:9042 (com.datastax.driver.core.exceptions.TransportException: [server020/XX.YY.ZZ.021:9042] Connection has been closed))

在没有 migrate 的情况下运行它arg 仍然工作正常。我怀疑 Spring 根本没有为该 Cassandra 服务器获取正确的证书,即使它似乎获取了所有其他配置属性(服务器名称、 key 空间等)

问题:如何制作一个 Spring Boot servlet,它还具有命令行模式并且可以在两种模式下连接到配置的 Cassandra 服务器?

最佳答案

您需要做的就是,

@SpringBootApplication
public class MyApplication
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

您的应用程序过于复杂。如果您运行 MyApplication.main,默认情况下将在端口 8080 中运行。

额外的好处,如果您需要两者都从同一个开始。

@SpringBootApplication
public class MigrationRunner implements CommandLineRunner {

@Autowired
Session session;


public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}

@Override
public void run(String[] args)
{
MigrationResources mr = new MigrationResources();
mr.addMigration(...);
mr.addMigration(...);

MigrationEngine.withSession(session).migrate(mr);
}
}

关于java - Spring Boot 在作为 Servlet 运行时可以连接到 Cassandra,但不能作为命令行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58755072/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com