【发布时间】:2011-03-17 08:17:49
【问题描述】:
我正在开发一个 Java 企业应用程序,目前正在做 Java EE 安全工作,以限制特定用户对特定功能的访问。我配置了应用程序服务器和所有内容,现在我使用 RolesAllowed-annotation 来保护方法:
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
当我像这样使用注释时,它工作正常:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
但这不是我想要的,因为我必须在这里使用字符串,重构变得困难,并且可能会发生拼写错误。因此,我不想使用字符串,而是使用枚举值作为此注释的参数。枚举看起来像这样:
public enum RoleType {
STUDENT("STUDENT"),
TEACHER("TEACHER"),
DEANERY("DEANERY");
private final String label;
private RoleType(String label) {
this.label = label;
}
public String toString() {
return this.label;
}
}
所以我尝试使用 Enum 作为这样的参数:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
然后我得到以下编译器错误,尽管 Enum.name 只返回一个字符串(它始终是常量,不是吗?)。
注解属性RolesAllowed.value的值必须是常量表达式`
接下来我尝试在我的枚举中添加一个额外的最终字符串:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
但这也不能作为参数起作用,导致同样的编译器错误:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
如何实现我想要的行为?我什至实现了自己的拦截器来使用自己的注释,这很漂亮,但是对于这样的小问题,代码行数太多了。
免责声明
这个问题最初是一个Scala 问题。我发现 Scala 不是问题的根源,所以我首先尝试在 Java 中执行此操作。
【问题讨论】:
-
对不起,这与解决您的问题有点无关,但我想我会提到,如果您只想让它们与枚举构造函数相同,则可以省去枚举构造函数的 String 参数你给他们起名字;您可以通过在枚举上调用 .name() 来访问相同的值。我相信 toString() 方法无论如何都委托给 name()。
标签: java jakarta-ee enums annotations java-ee-6