首页 > 解决方案 > 如何管理(或作为参数传递)我的配置 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 方法?

标签: javajsonvert.x

解决方案


我喜欢在我的 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 等库非常困难。


推荐阅读