1

我想创建一个命令,允许用户指定一个可用选项来执行命令。例如,这里是服务列表,命令是状态。用户可以针对部分服务发布命令“status --list Scarlet garnet cardinal”,或者针对完整服务发布命令“ status --all” 。我已经实现了以下内容:

@Command(name = "status", description = "checks the status of a service")
public void status(
        @Option(names = "--all", description = "checks all services.") boolean all,
        @Option(names = "--list", arity = "0..1", description = "checks specified services.") boolean list,
        @Parameters(paramLabel = "<service>", description = "a list of service names") List<String> services) {
    if (all) {
        System.out.println("check all");
    } else if (list) {
        System.out.println("check listed");
    }
}

它可以工作,但是有一个错误,也就是说,如果用户只提供命令“状态”而没有任何进一步的参数,则它被认为是有效的。我相信会发生这种情况,因为这两个选项都是布尔值。我们如何纠正这一点以提供至少一个可选选项?

4

1 回答 1

1

--list我认为您可以通过将选项从布尔值更改为数组或字符串集合来获得所需的行为。

例如:

@Command(name = "status", description = "checks the status of a service")
public void status(
        @Option(names = "--all", description = "checks all services.") boolean all,
        @Option(names = "--list", arity = "1..*", paramLabel = "<service>",
                description = "checks specified services.") List<String> services) {
    if (all) {
        System.out.println("check all");
    } else if (services != null && !services.isEmpty()) {
        System.out.println("check listed");
    }
}

如果选项是互斥的,您可以使用ArgGroup

但对于这种情况,最简单的解决方案可能是没有选项,只有要检查的服务列表。如果用户未指定服务,则应用程序将检查所有服务。

在代码中:

@Command(name = "status",
  description = "Checks the status of all services, or only the specified services.")
public void status(
        @Parameters(paramLabel = "<service>", arity = "0..*",
                    description = "A list of service names. Omit to check all services.") 
        List<String> services) {
    if (services == null || services.isEmpty()) {
        System.out.println("check all");
    } else {
        System.out.println("check listed");
    }
}
于 2021-02-12T02:11:35.873 回答