我希望能够使用我想要的参数调用注释,如下所示:
@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"})
事实上,前两个对我来说很好,这是困扰我的最后一个。
原因很简单。
对于权利,我想要一个方法可用于许多个人资料,{}表示“WITH”,我正在寻找“或”;)
(在我看来){}表示“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的一个例子
谢谢!
答案 0 :(得分:1)
据我所知,你不能这样做。
获得等效的一种方法是使用例如
@Authorize({"A,B,C", "D,E,F", "G,H,I"})
并在底层实现中,如果您需要具有单独的组件:
String[] component = x.value[idx].split(",");
此处分隔符是逗号,但可以是任何内容,具体取决于您的要求/限制。
问候。
答案 1 :(得分: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()
答案 2 :(得分: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 {};
}