2012-04-16 122 views
0

我希望能夠調用的註釋與儘可能多的參數,因爲我想,這樣的事情:註釋接受-n參數

@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"}) 

事實上,前兩個都沒什麼問題,這是最後一個打擾是我。

原因很簡單。

對於權利,我希望有一個方法可用於許多空間,{}表示「有」,我正在尋找一個「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查詢,只是我如何看待{的例子},並與/或)

謝謝!

+3

'{}的意思是「WITH」',你能詳細說明一下嗎? – biziclop 2012-04-16 10:11:56

+3

這將取決於實現,它是一個集合,「With」或「Or」完全取決於開發人員! – TacB0sS 2012-04-16 10:12:49

+0

在您的更新示例中,您強調了我提到的具體實現。 – TacB0sS 2012-04-16 11:26:00

回答

1

真的,它的定義了註釋含義的文檔,JDK根本不知道或關心。如果你正在尋找其他人的兩個銅片,那麼在我第一次讀到你的問題時,我認爲這個列表是一個OR,而不是一個AND。無論如何,如果您希望完全不歧義,請以自記文件的方式聲明您的註釋:

@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 {}; 
} 
+0

這很有趣!謝謝! – 2012-04-16 11:50:02

1

就我所知,你無法做到。拿到相當於

的一種方法是,如果你需要有單獨的組件用於例如

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

,並在底層實現:

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

這裏的分隔符是逗號,但可以根據您的要求/限制進行任何操作。

問候。

+0

這是一個不錯的主意,但如果不是String,我想要其他的東西(比如Enums)變得更加複雜。它仍然有可能,但我想要一個更簡單的方法來做到這一點(比解析每個字符串,試圖查看它們是否存在於枚舉中,等等)。 – 2012-04-16 11:48:41

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() 

(其中第二種形式是隻爲:)

速記
@Packages({ 
    @Authorize({"A", "B", "C"}) 
}) 
public void myMethod2() 
+0

我喜歡在子類中分割權利的想法,並強調這一事實{}並不一定意味着「WITH」。但是我發現這個技術在代碼方面更加沉重。 – 2012-04-16 11:48:05