I'm developing a Java Enterprise application, currently doing JEE-Security stuff to restrict access for particular functions to specific users. I configured the application server and everything, now i'm using the RolesAllowed-annotation to secure the methods:
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
When i use the annotation like this, it works fine:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
But this is not what i want, as i have to use a String here, refactoring becomes hard, and typos can happen. So instead of using a String, i would like to use an Enum value as a parameter for this annotation. The Enum looks like this:
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;
}
}
So i tried to use the Enum as a parameter like this:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
But then i get the following compiler error: The value for annotation attribute RolesAllowed.value must be a constant expression
, although Enum.name just returns a String (which is always constant, isn't it?).
Next thing i tried was to add an additional final String to my Enum:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
But this also doesn't work as a parameter, resulting in the same compiler error:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
How can i achieve the behavior i want? I even implemented my own interceptor to use my own annotations, which is beautiful, but far too much lines of codes for a little problem like this.
DISCLAIMER
Question was originally a Scala question. Found out that Scala is not the source of the problem, so i first try to do this in Java.