4

RESTeasyではこれ...

@GET
@Path("request")
public String requestJson(@QueryParam("arg1") @DefaultValue("") String arg1,
                          @QueryParam("arg2") @DefaultValue("0") Integer arg2);

...メソッドシグネチャで定義されたパラメータのサブセットを定義できます。確かに、次のようなメソッドシグネチャでこれと同じパターンを使用することが可能です。

@Method
public String requestJson(@OptionalParameter("arg1") @DefaultValue("") String arg1,
                          @OptionalParameter("arg2") @DefaultValue("0") Integer arg2);

これを行うことは可能ですか?もしそうなら、どのように?

4

2 に答える 2

3

オブジェクトがRESTEasyフレームワークによって管理されているため、RESTEasyの例の注釈が可能です。メソッドを検査し、それらのアノテーションに基づいてメソッドを呼び出す方法を決定できます。必要なアノテーションを作成することができます。重要なのは、メソッドを呼び出すコードがアノテーションとその処理方法を知っている必要があるということです。

于 2011-07-07T02:14:27.490 に答える
3

まず第一に、@lazが言ったことは正確に正しかった。これは、RESTEasyがクラスへの呼び出しを管理しているため、RESTEasyで可能です。

ここでの適切な質問は、requestJson()の呼び出しがどのようになると予想されるかということだと思います。いくつかの例:requestJson(1)andrequestJson("String")対andのようなrequestJson(null, 1)ものrequestJson("String", null)

これを処理するために私が考えることができる5つの方法があります:

  1. 最も自動化されていない方法(ただし、最終的には最良の方法):手動でバリアントメソッドを作成するか、IDEを設定してそれらを生成します。

  2. 値がない場合は、値をデフォルト値に設定するのは呼び出し元の責任になります(つまり、呼び出し元は「を持っているメソッドを呼び出している」と判断します。

  3. requestJson()の呼び出しをインターセプトし、必要に応じて欠落している値をプラグインします(これは、厄介なリフレクションまたはランタイムコード生成ブードゥーになります。可能ですが、単純ではありません。基本的に、独自のAOPライブラリを構築します。 requestJson()へのすべての呼び出しを管理しています。

  4. コンパイラ/ビルドチェーンにプラグインして、必要なメソッドを生成します。

    public String requestJson() { requestJson("", 0); }
    public String requestJson(String arg1) { requestJson(arg1, 0); }
    public String requestJson(Int arg2) { requestJson("", arg2); }
    public String requestJson(String arg1, Int arg2) {...}
    

    (これはここで説明されているものと似ています)

  5. requestJson実装の先頭に、欠落している値を判別するためのコードを追加します。これは、のようなものを有効にするだけrequestJson(null, 1)であり、おそらくあなたが探しているものではありません(requestJson()で追加の処理が必要になるため)。ボイラープレートをライブラリに抽出できる場合があります。

于 2011-07-07T02:22:53.833 に答える