Этот замечательный 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

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

Автор
0 комментариев
Для комментирования необходимо авторизоваться