2012-04-16 135 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