公司有一个紧急需求,通过websocket调用服务端接口,由于时间有限决定给客户先做一个命令行的脚本demo,学习了一下spring shell,写个博客记录一下。
1.spring shell 环境
需要引入spring boot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
我还配置了maven的打包工具
<build>
<plugins>
<plugin>
<!-- 配置打包工具 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.5.RELEASE</version>
<configuration>
<!-- 工程主入口 -->
<mainClass>com.bjnet.test.Main</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.spring shell 的main方法
springboot项目 和 springboot一样
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Main.class);
app.setBannerMode(Banner.Mode.OFF);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
}
3.springshell 定义命令
- @ShellComponet: 声明将此类注册为spring 的一个脚本组件
- @ShellMehod: 声明一个命令, 默认方法名为命令名称,如果有多个单词,生成的命令用-隔开,例如——方法名:openUser @shellMehod生成的默认命令名是open-user
@ShellComponent
public class CalculatorCommands {
@ShellMethod("计算两个整数的加法")
public int add(int a, int b){
return a + b;
}
}
打包后 java -jar xxx.jar 运行 add a b
4.springshell 自定义命令名称
将add命令自定义为-a
@ShellComponent
public class CalculatorCommands {
@ShellMethod(value = "计算两个整数的加法",key = {"-a"})
public int add(int a, int b){
return a + b;
}
}
命令就变为-a a b,add命令就会失效
5.springshell 参数默认值
当输入的命令需要参数时,可以在参数列表指定一个默认值,用户没有输入参数时会使用默认值
@ShellComponent
public class CalculatorCommands {
@ShellMethod(value = "计算两个整数的加法",key = {"-a"})
public int add(@ShellOption(defaultValue = "0")int a){
return a + b;
}
}
-a命令的a的默认值就是0
这里要注意defaultvalue=“0” 双引号不可少
int spring都要加双引号
6.springshell 命令提示符自定义
@Bean
public PromptProvider promptProvider() {
return () -> new AttributedString("aaa=>",
AttributedStyle.DEFAULT.foreground(AttributedStyle.BLUE));
}
命令前的shell就变为了蓝色的 aaa=>
AttributedStyle中还有许多定义文字粗体 隐藏 颜色的,可根据需要自定义
7.springshell 命令限制
@ShellMethod(value = "关闭WebSocket连接",key = {"-c"})
public void close(){
app.stop();
}
public Availability closeAvailability(){
return isConnect ?
Availability.available():
Availability.unavailable("you are not connect");
}
当用户输入-c命令时 会先执行return中的逻辑 判断是否是连接的 只有连接后才能输入-c关闭命令 否则报错,报错提示写在unavailable中。
这里的closeavailability 对应上面的方法名close 要对应 否则不生效
当然需要多次使用一个验证的时候,也可以指定availability的名字
@ShellMethod(value = "",key = {"-s"})
@ShellMethodAvailability({"isLogin"})
public void start(){
System.out.println("start");
}
}
@ShellMethod(value = "",key = {"-c"})
@ShellMethodAvailability({"isLogin"})
public void close(){
System.out.println("close");
}
}
public Availability isLogin(){
return isLogin ? Availability
.available():Availability
.unavailable("you are not login");
}
只有登录后才能运行开始和关闭命令
@ShellMethodAvailability指定方法名 实现复用
引用:https://blog.csdn.net/zongf0504?spm=1001.2014.3001.5509