命令可用性
注册的命令并不总是有意义的,这取决于应用程序的内部状态。
例如,可能存在一个download命令,但它只有在用户已在远程服务器上使用了connect之后才能工作。现在,如果用户尝试使用download命令,外壳应当解释该命令存在但当前不可用。
Spring Shell 允许你这样做,甚至可以让你提供一个简短的原因说明该命令为何不可用。
编程式
在程序化注册中,你可以使用`0`方法,该方法接受一个`1`。
private boolean connected;
@Bean
public AbstractCommand connect() {
return org.springframework.shell.core.command.Command.builder().name("connect").execute(ctx -> {
CommandOption connectedOption = ctx.getOptionByName("connected");
this.connected = Boolean.parseBoolean(connectedOption.value());
});
}
@Bean
public AbstractCommand download() {
return org.springframework.shell.core.command.Command.builder()
.name("download")
.availabilityProvider(
() -> connected ? Availability.available() : Availability.unavailable("you are not connected"))
.execute(ctx -> {
// do something
});
}
注解
使用基于注解的命令,您可以使用availabilityProvider属性来指定要使用的AvailabilityProvider bean名称。
@Component
class MyCommands {
private boolean connected;
@Command(name = "connect")
public void connect(String user, String password) {
connected = true;
}
@Command(name = "download", availabilityProvider = "downloadAvailability")
public void download() {
// do something
}
@Bean
public AvailabilityProvider downloadAvailability() {
return () -> connected ? Availability.available() : Availability.unavailable("you are not connected");
}
}
The connect 方法用于连接到服务器(细节省略),在完成时通过connected 布尔值改变命令的状态。
The download 命令将在用户连接之前不可用。
可用性提供程序返回一个Availability 实例,该实例由两个工厂方法之一构造。如果命令不可用,则必须提供解释。
现在,如果用户在未连接的情况下尝试调用该命令,将会发生以下情况:
shell:>download
Command 'download' exists but is not currently available because you are not connected.
| 当命令不可用时提供的理由应在"because"之后优美地附加。不应以大写字母开始句子或添加最终的句号。 |
| Spring Shell 不对如何编写命令和类的组织方式施加许多限制。 然而,将相关的命令放在同一个类中通常是个好习惯,这样可以使可用性指示器受益。 |