如何在Spring Shell 3.0.0中实现子命令(多级命令)功能?
在Spring Shell 3.0.0中实现子命令结构
完全可以实现你想要的子命令结构,核心是通过@ShellMethod的key属性定义命令层级,每个子命令作为独立方法存在,保留各自的参数、帮助文本和配置。下面是具体实现方式:
1. 定义子命令方法
为每个子命令单独创建方法,在@ShellMethod的key属性中用空格分隔顶级命令和子命令,比如"foo list"、"foo describe"。这样Spring Shell会自动识别命令层级。
示例代码:
import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; import org.springframework.shell.standard.ShellOption; import org.springframework.shell.availability.Availability; import org.springframework.shell.standard.ShellMethodAvailability; @ShellComponent public class FooCommands { @ShellMethod(key = "foo list", value = "列出所有Foo实例") public String listFoos() { return "已找到Foo实例:Foo1、Foo2、Foo3"; } @ShellMethod(key = "foo describe", value = "查看指定Foo的详细信息") public String describeFoo(@ShellOption(help = "要查询的Foo ID") String fooId) { return String.format("Foo ID: %s\n描述:示例Foo详情内容", fooId); } // 为子命令配置可用性控制(示例) @ShellMethodAvailability("describeFoo") public Availability describeFooAvailability() { // 这里可以添加自定义的可用性判断逻辑 return Availability.available(); } }
import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; @ShellComponent public class BarCommands { @ShellMethod(key = "bar list", value = "列出所有Bar实例") public String listBars() { return "已找到Bar实例:BarA、BarB、BarC"; } }
2. 验证效果
按上述配置后,就能实现你想要的交互效果:
- 输入
foo,Shell会自动展示该顶级命令下的所有子命令:Available commands under 'foo': foo describe - 查看指定Foo的详细信息 foo list - 列出所有Foo实例 - 输入
help foo,会展示所有foo子命令的完整帮助,包括参数说明和可用性配置; - 输入
foo describe XYZ,会直接调用对应的方法并返回结果; - 每个子命令独立配置
@ShellOption、@ShellMethodAvailability等注解,完全保留专属的参数规则和行为控制。
3. 补充说明
- 不需要额外创建接收子命令参数的顶级
foo/bar方法,Spring Shell会自动识别以foo开头的命令组,处理子命令列表展示逻辑; - 可以配合
@ShellCommandGroup注解为命令分组添加更友好的分类名称,但这仅优化帮助文本的展示,不影响子命令的层级结构。
内容的提问来源于stack exchange,提问作者anarchitect
相关产品推荐
相关产品推荐

