0

私はSpring Shellプロジェクトに取り組んでいます。このツールは、データベース内のデータを操作するためのコマンド ライン ツールです。add user (データベースのテーブルにレコードを追加する) のようなコマンドがあります。コマンドを実行するには、ツールのユーザーがデータベースに接続する必要があります。これをすべて1行で実行できるようにしたいと思います。私のツールのユーザーは、次のようなコマンドを記述できるはずです。

--database 接続文字列 xyz --username abc --password mno add user --username bob --role AA_ADMIN --company Microsoft

ここで、add user コマンドを実行するには、データベース接続文字列、ユーザー名、およびパスワードの 3 つのパラメータが必要です。

以下に、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: シアトル

誰もこれを行う方法を知っていますか? これが不可能な場合は、可能であればそれまたは代替案を聞きたいと思います。

4

1 に答える 1

2

ここには 2 つのオプションがあります。

  • それらを必要とするすべてのコマンドのこれらの3つの追加パラメーター( )パラメーターを作成します(特定の例では、これらのパラメーターの1つ[DBに接続するもの、またはユーザーを表すdatabase, username, passwordもの)の名前を変更する必要があることに注意してくださいusername追加するには] 明らかに同じ名前の 2 つのパラメーターを持つことはできないため)。
  • 例で説明されているのと同様のアプローチを使用します@CliAvailabilityIndicator。最初のコマンド (おそらくuseまたはという名前connect) は、最初に 3 つの指定されたパラメーターとの接続をテストし、それらをどこかに保存しadd userます。それらの値。

また、実際には 2 つの組み合わせを使用できることにも注意してください (つまり、ソリューション 2 を使用してデフォルトを提供し、ケースバイケースでソリューション 1 によってオーバーライドされる場合があります)。

最後に、コマンド名は先頭にある必要があり、含めることはできないため、質問の冒頭で説明したようなものを使用することは決してできないことに注意してください--options do )

于 2014-07-18T15:00:04.937 に答える