java - 如何管理(或作为参数传递)我的配置 json 以开始测试我的 vertx 应用程序?
问题描述
我有一个小型 vertx 应用程序,它有一个扩展 VertxCommandLauncher 的 AppLauncher 类,我使用典型的配置参数设置了一个 appConfig.json:
public class AppLauncher extends VertxCommandLauncher implements VertxLifecycleHooks {
public static void main(String[] args) {
new AppLauncher().dispatch(args);
}
@Override
public void afterConfigParsed(JsonObject config) {
AppConfig.INSTANCE.setConfig(config);
}
为了在我的 IDE 中运行我的应用程序,我将编辑配置放入我的主类(Applauncher.java)和参数:
run io.vertx.covid.verticle.MainVerticle -conf../vertx-application/src/main/resources/appConfig.json
这是我的测试课:
@BeforeAll
static void deployVerticles(Vertx vertx, VertxTestContext testContext) {
vertx.deployVerticle(BaseVerticle.class.getName(),testContext
.succeeding(id->testContext.completeNow()));
}
这是我的 BaseVerticle 类,我所有的verticles都从:
public abstract class BaseVerticle extends AbstractVerticle {
public static String CONTEXT_PATH = AppConfig.INSTANCE.getConfig().getString(Constants.CONTEXT_PATH);
}
这是我的 AppConfig 类:
public enum AppConfig {
INSTANCE;
private JsonObject config;
public JsonObject getConfig() {
return config;
}
public void setConfig(JsonObject config) {
this.config = config;
}
}
一切正常,但是如果我想以单独的方式对其进行测试,那么我会部署我的 Verticle,但我在 CONTEXT_PATH(BaseVerticle 类)中有一个Nullpointer,因为配置(假设取自 appConfig.json)为空。我还没有找到使用 appConfig.json 传递参数的方法,还是应该调用传递参数的 main 方法?
解决方案
我喜欢在我的 vertx 应用程序中做一些类似于配置文件的事情。
如果vertx-config-path
在初始化 vertx 实例之前使用键设置环境变量,则可以控制 vertx 的配置检索器(您可能需要将 vert-config 添加到 gradle/maven 依赖项)从何处获取配置。
在您的启动器中,您可以执行以下操作,这将使您能够将基于配置文件的配置文件添加到配置文件名称conf/config-%s.json
所在的资源文件夹中%s
:
public class CustomLauncher extends Launcher {
public static final String ACTIVE_PROFILE_PROPERTY = "APP_ACTIVE_PROFILE";
private static final CLI cli = CLI.create("main")
.addOption(new Option()
.setShortName("p")
.setLongName("profile")
);
public static void main(String[] args) {
initDefaults(Arrays.asList(args));
new CustomLauncher().dispatch(args);
}
public static void executeCommand(String cmd, String... args) {
initDefaults(Arrays.asList(args));
new CustomLauncher().execute(cmd, args);
}
public static void initDefaults(List<String> args) {
System.setProperty(LoggerFactory.LOGGER_DELEGATE_FACTORY_CLASS_NAME, SLF4JLogDelegateFactory.class.getName());
CommandLine parse = cli.parse(args);
String profile = parse.getOptionValue("p");
if (profile != null && !profile.isEmpty()) {
System.setProperty(ACTIVE_PROFILE_PROPERTY, profile);
System.setProperty("vertx-config-path", String.format("conf/config-%s.json", profile));
}
}
}
然后在您的测试中,您可以自己初始化它并控制配置文件(也就是要加载的配置文件),而不是中继 vertx 测试扩展来为您注入 vertx,如下所示:
private static Vertx vertx;
@BeforeAll
public static void deployVerticles(VertxTestContext testContext) {
CustomLauncher.initDefaults(Arrays.asList("--profile", "test"))
vertx = Vertx.vertx();
ConfigRetriever.create(vertx).getConfig(asyncResult -> {
if (asyncResult.succeeded()) {
JsonObject config = asyncResult.result();
DeploymentOptions deploymentOptions = new DeploymentOptions()
.setConfig(config);
vertx.deployVerticle(BaseVerticle.class.getName(), deploymentOptions);
} else {
// handle failure
}
});
}
然后,当您运行应用程序时,您可以使用-p
或--profile
我还强烈建议您熟悉 vertx-config,因为您还可以获得环境变量、k8s 配置映射等等。
编辑:如果可能的话,我也强烈建议转移到 Kotlin,使异步代码更容易以命令式的方式处理(使用协程)。与 Kotlin 等语言相比,在 Java 中处理 Vert.x 等库非常困难。
推荐阅读
- excel - 如何在excel中使用vba将不同的单元格值转换为单行?
- authentication - Getting a unique id after biometrics authentication in flutter
- javascript - Props updates in setInterval not reflected when changing component
- graphviz - 如何允许边与节点重叠?
- python - 使用 re 创建停用词列表
- go - 去 mod 供应商而不更新到最新版本
- .htaccess - http 用于本地,https 用于远程。怎么做?
- r - 将向量中的开始位置映射到另一个向量中的停止位置
- python - 为什么我的动态饼图显示不正确的值?
- spring-boot - 在linux中从systemd服务运行spring boot jar时出错