0

次のように、必要な数のパラメーターを使用して注釈を呼び出すことができるようにしたいと思います。

@Authorize("Admin", "Moderator", "User")
public static void read() {
    // ...
}

これまでのところ、ここに私の注釈があります:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Authorize {
    String[] value() default {};
}

しかし、ご存知かもしれませんが、これは次の場合にのみ機能します。

@Authorize
@Authorize("Admin")
@Authorize({"Admin", "Moderator", "User"})

実際、最初の 2 つは問題ありませんが、気になるのは最後の 1 つです。

理由は簡単です。

権利については、多くのプロファイルでメソッドを使用できるようにしたいと考えています。{} は「WITH」を意味し、「OR」を探しています ;)

(私の見解では) {} は「パッケージとして」提供されるため、「WITH」を意味します。相互リンクされたアイテム。たとえば、次のようにします。

SomeQuery.select({"A", "B", "C"}, {"D", "E", "F"}, {"G", "H", "I"})

私はそれを次のように翻訳します:

SELECT WHERE (A, B, C) OR (D, E, F) OR (G, H, I);

(これは SQL クエリではありません。{} と With/Or の表示方法の例にすぎません)

ありがとう!

4

3 に答える 3

1

私の知る限り、あなたはそれをすることはできません。

同等のものを取得する1つの方法は、たとえば次を使用することです

@Authorize({"A,B,C", "D,E,F", "G,H,I"})

個々のコンポーネントが必要な場合は、基礎となる実装で:

String[] component = x.value[idx].split(",");

ここで区切り記号はコンマですが、要件/制限に応じて何でもかまいません。

よろしく。

于 2012-04-16T10:34:41.433 に答える
1

次のことができます

public @interface Authorize {
    String[] value();
}

public @interface Packages {
    Authorize[] value();
}

だから、あなたが持つことができます

@Packages({
   @Authorize({"A", "B", "C"}),
   @Authorize({"D", "E", "F"}),
   @Authorize({"G", "H", "I"})
})
public void myMethod()

また

@Authorize({"A", "B", "C"})
public void myMethod2()

(ここで、2 番目の形式は :) の短縮形です。

@Packages({
   @Authorize({"A", "B", "C"})
})
public void myMethod2()
于 2012-04-16T11:00:54.063 に答える
1

実際、注釈の意味を定義するのはドキュメントであり、JDKは単に知らないか気にしません。他の誰かの 2 つの銅貨を探している場合、あなたの質問を最初に読んだとき、リストは AND ではなく OR であると想定しました。いずれにせよ、完全に明確にしたい場合は、自己文書化するような方法で注釈を宣言してください。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Authorize {
    /**
     * Roles to authorize. By default, any of the roles specified
     * will be accepted as authorization
     */
    String[] value() default {};

    /**
     * Roles to authorize. Any matched role in the list will be accepted
     * as authorization.
     */
    String[] anyOf() default {};

    /**
     * Roles to authorize. All roles in the list must match to be accepted
     * as authorization.
     */
    String[] allOf() default {};
}
于 2012-04-16T11:01:42.997 に答える