1

我在创建 REST 服务器或 Picocli CLI 应用程序方面没有问题。但是,如果我想在一个应用程序中同时拥有这两者怎么办?

问题是,我想要一个通过 REST 服务器提供一些业务逻辑的应用程序(那里没问题),但在其他一些情况下,我想通过 CLI 触发业务逻辑而不启动 HTTP 服务器(例如,对于 CI/CD )。

我不确定如果我通过启动应用程序 PicocliRunner.run(Application.class, args)并且如果给定特定参数运行服务器是否遇到问题Micronaut.run(Application.class);,因为它们会创建不同的上下文。

有谁知道实现这一目标的正确方法?

这就是我解决它的方法:

import io.micronaut.configuration.picocli.PicocliRunner;
import io.micronaut.runtime.Micronaut;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

@Command(
        name = "RestAndCliExample",
        description = "...",
        mixinStandardHelpOptions = true
)
public class Application implements Runnable {
    private enum Mode {serve, run}

    @Parameters(index = "0", description = "Execution mode: ${COMPLETION-CANDIDATES}")
    private Mode mode;

    public static void main(String[] args) throws Exception {
        args = new String[]{"run"};
        PicocliRunner.run(Application.class, args);
    }

    public void run() {
        if (Mode.serve.equals(mode)) {
            // Start REST API
            Micronaut.run(Application.class);
        } else {
            // TODO run code directly
        }
    }
}
4

1 回答 1

0

实现此目的@Inject的一种方法是ApplicationContext进入您的@Command-annotated 类。这允许您的命令使用相同的应用程序上下文,而不需要启动一个单独的应用程序上下文。

然后,在您的run方法中,您可以通过EmbeddedServer从应用程序上下文获取并调用start它来启动 REST 服务器,或者您可以在没有 REST 服务器的情况下直接执行功能。

另请参阅此答案以获取更多详细信息:https ://stackoverflow.com/a/56751733/1446916

于 2019-08-20T00:40:00.443 回答