Этот замечательный Spring Shell
В этой заметке хотим вас познакомить с замечательным проектом Spring Shell для создания CLI-интерфейса. Если для вашего проекта Web UI или UI на Swing слишком сложен, но хочется использовать все возможности Spring, то Spring Shell — прекрасное решение.
Задача — сделать приложение, которое говорит пользователю "Hello, ${username}"
Для начала создадим пустой проект на основе Spring Boot. Можем попробовать его собрать:
mvnw clean install
И запустить:
mvnw spring-boot:run
И, конечно, сначала добавим бизнес-логику HelloService:
@Service public class HelloService { public String helloTo(String username) { return "Hello, " + username; } }
Добавим к этому сервису интерфейс из Spring Shell. Сначала maven-зависимость:
<dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency>
Эта зависимость является, так называемым, «стартером». Вам необходимо добавить только её, а другие необходимые зависимости подключаются транзитивно. Хотим отметить, что этот «стартер» не является «Spring Boot-стартером», и может быть использован вне Spring Boot.
Попробуем запустить наше приложение:
mvnw spring-boot:run
После некоторого вывода в консоль, мы увидим приглашение spring-shell.
shell:>
Мы можем посмотреть список всех доступных команд:
shell:>help AVAILABLE COMMANDS Built-In Commands clear: Clear the shell screen. exit, quit: Exit the shell. help: Display help about available commands. history: Display or save the history of previously run commands script: Read and execute commands from a file. stacktrace: Display the full stacktrace of the last error.
Круто! Попробуйте запустить clear. А также посмотрите историю команд:
shell:>history help clear history
Как, ни странно, даже запуская тесты у нас тоже запустится shell-консоль:
mvnw clean install ... shell:>
Чтобы в рамках тестов она не запускалась — сделаем некоторые правки:
@RunWith(SpringRunner.class) @SpringBootTest(properties = { InteractiveShellApplicationRunner.SPRING_SHELL_INTERACTIVE_ENABLED + "=false", ScriptShellApplicationRunner.SPRING_SHELL_SCRIPT_ENABLED + "=false" }) public class SpringShellDemoApplicationTests {
Вот, теперь мы готовы к тому, чтобы реализовать консольный интерфейс к нашей логике:
@ShellComponent public class HelloShell { private final HelloService helloService; public HelloShell(HelloService helloService) { this.helloService = helloService; } @ShellMethod(key = "hello-to", value = "Say hello to username") public String helloTo(@ShellOption({"username", "u"}) String username) { return helloService.helloTo(username); } }
Испытаем в деле?
shell:>help AVAILABLE COMMANDS ... Hello Shell hello-to: Say hello to username
Да, обратите внимание на description группы команд и самой команды. Если мы введём неполную команду, то получим:
shell:>hello-to Parameter 'username string' should be specified Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.
Ну и, наконец:
shell:>hello-to Ivan Hello, Ivan
С приведённым кодом можно ознакомиться здесь. И не забывайте оставлять свои комментарии!