Spring Shell - 在执行 Shell 方法的过程中捕获用户输入

Spring Shell - capturing user input in middle of executing ShellMethod

是一种在执行过程中捕获用户输入的方法 @ShellMethod。基本上停止执行请求用户输入的方法并在捕获后继续执行。

您应该能够直接与 System.in 交互,尽管这并不是 Spring Shell 的真正意义:命令应该是独立的。

这里有可能的解决方案:, authored by ZachOfAllTrades

它仅在您的应用程序基于 SpringBoot 时有效,因此您可以访问由 SpringBoot 配置的 LineReader 对象。

@Autowired
LineReader reader;

public String ask(String question) {
    return this.reader.readLine("\n" + question + " > ");
}

@ShellMethod(key = { "setService", "select" }, value = "Choose a Speech to Text Service")
public void setService() {
    boolean success = false;
    do {
        String question = "Please select a service.";

        // Get Input
        String input = this.ask(question);

        // Input handling
        /*
         * do something with input variable
         */
        success = true;

        }
    } while (!success);
}

虽然我自己没有尝试过。

使用SpringShellUI组件,现在我们在未来。

“从 2.1.x 开始有一个新的组件模型,它提供了更简单的方法来为常见用例创建更高级别的用户交互,例如以各种形式询问输入。这些通常只是纯文本输入或从列表中选择某项。"

@ShellComponent
public class ComponentCommands extends AbstractShellComponent {

    @ShellMethod(key = "component string", value = "String input", group = "Components")
    public String stringInput(boolean mask) {
        StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue");
        component.setResourceLoader(getResourceLoader());
        component.setTemplateExecutor(getTemplateExecutor());
        if (mask) {
            component.setMaskCharater('*');
        }
        StringInputContext context = component.run(StringInputContext.empty());
        return "Got value " + context.getResultValue();
    }
}

https://docs.spring.io/spring-shell/docs/2.1.0-SNAPSHOT/site/reference/htmlsingle/#_build_in_components