我正在開發一個Java企業應用程序,目前正在執行Java EE安全性內容以限制特定用戶對特定功能的訪問。我配置了應用服務器和一切,現在我使用的RolesAllowed的註釋,以確保方法:使用枚舉類型作爲@ RolesAllowed-Annotation的值參數
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
當我使用這樣的註解,它工作正常:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
但這不是我想要的,因爲我必須在這裏使用字符串,重構變得困難,並且可能發生錯字。因此,我不想使用字符串,而是使用Enum值作爲此註釋的參數。枚舉看起來是這樣的:
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;
}
}
於是,我就用枚舉作爲這樣的參數:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
但後來我得到以下編譯器錯誤,儘管Enum.name只返回一個字符串(這總是不變的,不是嗎?)。
The value for annotation attribute RolesAllowed.value must be a constant expression`
我想接下來的事情是一個額外的最終字符串添加到我的枚舉:
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()。 – I82Much 2010-07-17 15:40:24
可能的重複[如何提供枚舉值從Java常量註釋](http://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from- a-constant-in-java) – 2015-07-31 09:26:36