命令可用性

注册的命令并不总是有意义的,这取决于应用程序的内部状态。 例如,可能存在一个download命令,但它只有在用户已在远程服务器上使用了connect之后才能工作。现在,如果用户尝试使用download命令,外壳应当解释该命令存在但当前不可用。 Spring Shell 允许你这样做,甚至可以让你提供一个简短的原因说明该命令为何不可用。spring-doc.cadn.net.cn

编程式

在程序化注册中,你可以使用`0`方法,该方法接受一个`1`。spring-doc.cadn.net.cn

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名称。spring-doc.cadn.net.cn

@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 实例,该实例由两个工厂方法之一构造。如果命令不可用,则必须提供解释。 现在,如果用户在未连接的情况下尝试调用该命令,将会发生以下情况:spring-doc.cadn.net.cn

shell:>download
Command 'download' exists but is not currently available because you are not connected.
当命令不可用时提供的理由应在"because"之后优美地附加。不应以大写字母开始句子或添加最终的句号。
Spring Shell 不对如何编写命令和类的组织方式施加许多限制。 然而,将相关的命令放在同一个类中通常是个好习惯,这样可以使可用性指示器受益。