由于应用程序的内部状态,注册的命令并不总是有意义的。 例如,可能有一个命令,但它仅在用户在遥控器上使用后才起作用 服务器。现在,如果用户尝试使用该命令,shell 应该解释这一点 该命令存在,但当时不可用。 Spring Shell 允许你这样做,甚至让你提供一个简短的解释,说明原因 命令不可用。downloadconnectdownloadSpring中文文档

编程

通过编程注册,您可以使用采用 .availabilitySupplier<Availability>Spring中文文档

private boolean connected;

@Bean
public CommandRegistration connect(
		CommandRegistration.BuilderSupplier builder) {
	return builder.get()
		.command("connect")
		.withOption()
			.longNames("connected")
			.required()
			.type(boolean.class)
			.and()
		.withTarget()
			.consumer(ctx -> {
				boolean connected = ctx.getOptionValue("connected");
				this.connected = connected;
			})
			.and()
		.build();
}

@Bean
public CommandRegistration download(
		CommandRegistration.BuilderSupplier builder) {
	return builder.get()
		.command("download")
		.availability(() -> {
			return connected
				? Availability.available()
				: Availability.unavailable("you are not connected");
		})
		.withTarget()
			.consumer(ctx -> {
				// do something
			})
			.and()
		.build();
}

注解

通过基于注释的命令,您可以与 一起使用 。@CommandAvailabilityAvailabilityProviderSpring中文文档

@Command
class MyCommands {

	private boolean connected;

	@Command(command = "connect")
	public void connect(String user, String password) {
		connected = true;
	}


	@Command(command = "download")
	@CommandAvailability(provider = "downloadAvailability")
	public void download(
	) {
		// do something
	}

	@Bean
	public AvailabilityProvider downloadAvailability() {
		return () -> connected
			? Availability.available()
			: Availability.unavailable("you are not connected");
	}
}

旧版注释

命令有三种可能的方式来指示可用性。 它们都使用 no-arg 方法,该方法返回 的实例。 请看以下示例:AvailabilitySpring中文文档

@ShellComponent
public class MyCommands {

	private boolean connected;

	@ShellMethod("Connect to the server.")
	public void connect(String user, String password) {
		// do something
		connected = true;
	}

	@ShellMethod("Download the nuclear codes.")
	public void download() {
		// do something
	}

	public Availability downloadAvailability() {
		return connected
			? Availability.available()
			: Availability.unavailable("you are not connected");
	}
}

该方法用于连接到服务器(省略详细信息),从而更改状态 完成后通过布尔值的命令。 由于存在,在用户连接之前标记为不可用的命令 与名称中带有后缀的命令方法完全相同的方法。 该方法返回一个 的实例,该实例使用两个工厂方法之一构造。 如果该命令不可用,则必须提供说明。 现在,如果用户尝试在未连接时调用该命令,则会发生以下情况:connectconnecteddownloaddownloadAvailabilityAvailabilitySpring中文文档

shell:>download
Command 'download' exists but is not currently available because you are not connected.
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

集成帮助中还使用有关当前不可用的命令的信息。请参阅帮助Spring中文文档

如果将命令不可用时提供的原因附加在“因为”之后,则应该读起来很不错。Spring中文文档

您不应该以大写字母开头句子或添加最后一个句点Spring中文文档

如果以命令方法的名称命名可用性方法不适合您,则 可以使用注释提供显式名称:@ShellMethodAvailabilitySpring中文文档

@ShellMethod("Download the nuclear codes.")
@ShellMethodAvailability("availabilityCheck") (1)
public void download() {
}

public Availability availabilityCheck() { (1)
	return connected
		? Availability.available()
		: Availability.unavailable("you are not connected");
}
1 名称必须匹配

最后,通常情况下,同一类中的多个命令共享相同的内部状态,因此, 应全部作为一个组可用或不可用。Spring Shell 不必在所有命令方法上都粘贴 ,而是允许您翻转内容并将注释放在可用性方法上,并指定它控制的命令的名称:@ShellMethodAvailability@ShellMethodAvailabiltySpring中文文档

@ShellMethod("Download the nuclear codes.")
public void download() {
}

@ShellMethod("Disconnect from the server.")
public void disconnect() {
}

@ShellMethodAvailability({"download", "disconnect"})
public Availability availabilityCheck() {
	return connected
		? Availability.available()
		: Availability.unavailable("you are not connected");
}

该属性的默认值为 。这个特别的 通配符匹配所有命令名称。这使得打开或关闭单个类的所有命令变得容易 使用单一可用性方法:@ShellMethodAvailability.value()*Spring中文文档

@ShellComponent
public class Toggles {

	@ShellMethodAvailability
	public Availability availabilityOnWeekdays() {
		return Calendar.getInstance().get(DAY_OF_WEEK) == SUNDAY
			? Availability.available()
			: Availability.unavailable("today is not Sunday");
	}

	@ShellMethod
	public void foo() {}

	@ShellMethod
	public void bar() {}
}
Spring Shell 对如何编写命令和如何组织类没有施加太多限制。 但是,将相关命令放在同一类中通常是很好的做法,并且可用性指示器 可以从中受益。

如果将命令不可用时提供的原因附加在“因为”之后,则应该读起来很不错。Spring中文文档

您不应该以大写字母开头句子或添加最后一个句点Spring中文文档

1 名称必须匹配

该属性的默认值为 。这个特别的 通配符匹配所有命令名称。这使得打开或关闭单个类的所有命令变得容易 使用单一可用性方法:@ShellMethodAvailability.value()*Spring中文文档

@ShellComponent
public class Toggles {

	@ShellMethodAvailability
	public Availability availabilityOnWeekdays() {
		return Calendar.getInstance().get(DAY_OF_WEEK) == SUNDAY
			? Availability.available()
			: Availability.unavailable("today is not Sunday");
	}

	@ShellMethod
	public void foo() {}

	@ShellMethod
	public void bar() {}
}
Spring Shell 对如何编写命令和如何组织类没有施加太多限制。 但是,将相关命令放在同一类中通常是很好的做法,并且可用性指示器 可以从中受益。