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

事实上,前两个对我来说很好,这是困扰我的最后一个。

原因很简单。

对于权利,我希望一种方法可用于许多配置文件,{} 表示“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

据我所知,你做不到。

获得等价物的一种方法是使用例如

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

(第二种形式只是简写:)

@Packages({
   @Authorize({"A", "B", "C"})
})
public void myMethod2()
于 2012-04-16T11:00:54.063 回答
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 {};
}
于 2012-04-16T11:01:42.997 回答