Включить параметры для Spring Shell перед методом

Я работаю над проектом Spring Shell. Инструмент представляет собой инструмент командной строки для управления данными в базе данных. Есть такие команды, как добавить пользователя (добавляет запись в таблицу базы данных). Для выполнения любых команд пользователь инструмента должен быть подключен к базе данных. Я хотел бы иметь возможность запускать все это в одной строке. Пользователь моего инструмента должен иметь возможность написать команду, подобную следующей.

--строка подключения к базе данных xyz --имя пользователя abc --пароль mno добавить пользователя --имя пользователя bob --role AA_ADMIN --company Microsoft

Здесь для запуска команды добавления пользователя требуются строка подключения к базе данных с тремя параметрами, имя пользователя и пароль.

Ниже я включил пример кода из справочной документации Spring Shell.

package commands;

import org.springframework.shell.core.CommandMarker;
import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import org.springframework.stereotype.Component;

@Component
public class UserManipulation implements CommandMarker {

    private boolean simpleCommandExecuted = false;

@CliAvailabilityIndicator({"hw simple"})
public boolean isSimpleAvailable() {
    //always available
    return true;
}

@CliAvailabilityIndicator({"hw complex", "hw enum"})
public boolean isComplexAvailable() {
    if (simpleCommandExecuted) {
        return true;
    } else {
        return false;
    }
}

@CliCommand(value = "hw simple", help = "Print a simple hello world message")
public String simple(
        @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final String message,
        @CliOption(key = { "location" }, mandatory = false, help = "Where you are saying hello", specifiedDefaultValue="At work") final String location) {
    simpleCommandExecuted = true;
    return "Message = [" + message + "] Location = [" + location + "]";
}

@CliCommand(value = "hw complex", help = "Print a complex hello world message")
public String hello(
        @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final String message,
        @CliOption(key = { "name1"}, mandatory = true, help = "Say hello to the first name") final String name1,
        @CliOption(key = { "name2" }, mandatory = true, help = "Say hello to a second name") final String name2,
        @CliOption(key = { "time" }, mandatory = false, specifiedDefaultValue="now", help = "When you are saying hello") final String time,
        @CliOption(key = { "location" }, mandatory = false, help = "Where you are saying hello") final String location) {
    return "Hello " + name1 + " and " + name2 + ". Your special message is "  + message + ". time=[" + time + "] location=[" + location + "]";
}

@CliCommand(value = "hw enum", help = "Print a simple hello world message from an enumerated value")
public String eenum(
        @CliOption(key = { "message" }, mandatory = true, help = "The hello world message") final MessageType message){
    return "Hello.  Your special enumerated message is " + message;
}

enum MessageType {
    Type1("type1"),
    Type2("type2"),
    Type3("type3");

    private String type;

    private MessageType(String type){
        this.type = type;
    }

    public String getType(){
        return type;
    }
}

}

Итак, в настоящее время hw simple — это команда, которую необходимо выполнить перед запуском команды hw complex или hw enum. Я не хочу, чтобы hw simple был командой, вместо этого параметр сообщения в команде hw simple должен быть параметром, который требуется в качестве предварительного условия для запуска hw complex или hw enum. Так, например, команда, которую я хотел бы запустить.

--message hw complex --message abc --name1 def --name2 ghi --time 7:98 --location: Сиэтл

Кто-нибудь знает как это сделать? Если это невозможно сделать, я хотел бы услышать это или любые альтернативные идеи, если это возможно.


person user3108671    schedule 17.07.2014    source источник


Ответы (1)


Здесь у вас есть 2 варианта:

  • либо сделайте эти 3 дополнительных параметра (database, username, password) параметрами каждой команды, которая их требует (обратите внимание, что в вашем конкретном примере вам нужно будет переименовать один из этих username параметров [тот, который подключается к БД, или тот, который представляет пользователь для добавления], так как у вас не может быть 2 параметров с одинаковыми именами, очевидно).
  • Используйте подход @CliAvailabilityIndicator, аналогичный тому, что описан в примере, где первая команда (может быть названа use или connect) сначала проверяет соединение с 3 заданными параметрами и где-то их сохраняет, так что любая дальнейшая "настоящая" команда (такая как add user) могут использовать эти значения.

Также обратите внимание, что на самом деле вы можете использовать комбинацию этих двух способов (т. е. использовать решение 2 для предоставления значений по умолчанию, которые могут быть переопределены в каждом конкретном случае решением 1).

Наконец, обратите внимание, что вы никогда не сможете получить нечто похожее на то, что вы описываете в начале своего вопроса, поскольку имена команд должны быть в начале и они не могут содержать -- (варианты сделать)

person ebottard    schedule 18.07.2014