Этот замечательный Spring Shell | OTUS
🔥 BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Highload Architect
-25%
JavaScript Developer. Basic
-25%
Kotlin Backend Developer
-25%
JavaScript Developer. Professional
-25%
Android Developer. Basic
-25%
Unity Game Developer. Basic
-25%
Разработчик C#
-25%
Программист С Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Reverse-Engineering. Professional CI/CD Vue.js разработчик VOIP инженер Программист 1С Flutter Mobile Developer Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «IaC Ansible»
-16%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Супер-интенсив "SQL для анализа данных"
-16%
Базы данных Сетевой инженер AWS для разработчиков Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT IoT-разработчик Супер-интенсив «ELK»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Этот замечательный Spring Shell

Spring_Deep_16.8-5020-e09334.png

В этой заметке хотим вас познакомить с замечательным проектом 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

С приведённым кодом можно ознакомиться здесь. И не забывайте оставлять свои комментарии!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!