Ich entwickle eine Java-Unternehmensanwendung, die derzeit Java EE-Sicherheitsfunktionen ausführt, um den Zugriff für bestimmte Funktionen auf bestimmte Benutzer zu beschränken. Ich baute den Anwendungsserver und alles, und jetzt bin ich mit der RolesAllowed-Annotation, die Methoden zu sichern:Enum-Typ als Wertparameter für @ RolesAllowed-Annotation verwenden
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Wenn ich die Anmerkung wie diese, es funktioniert gut:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Aber das ist nicht was ich will, da ich hier einen String verwenden muss, Refactoring wird schwer, und Tippfehler können passieren. Anstatt einen String zu verwenden, möchte ich einen Enum-Wert als Parameter für diese Annotation verwenden. Die Enum sieht wie folgt aus:
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;
}
}
Also habe ich versucht, die Enum als Parameter wie folgt zu verwenden:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
Aber dann bekomme ich die folgende Compiler-Fehler, obwohl Enum.name gibt nur einen String (Das ist immer konstant, oder?).
The value for annotation attribute RolesAllowed.value must be a constant expression`
Das nächste, was ich versuchte, einen zusätzlichen final String in meine Enum hinzuzufügen:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
Aber das ist auch nicht als Parameter arbeitet, in dem gleichen Compiler Fehler führt:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
Wie kann ich das gewünschte Verhalten erreichen? Ich habe sogar meinen eigenen Abfangjäger implementiert, um meine eigenen Anmerkungen zu verwenden, was schön ist, aber viel zu viele Codezeilen für ein kleines Problem wie dieses.
HAFTUNGSAUSSCHLUSS
Diese Frage war ursprünglich eine Scala Frage. Ich habe herausgefunden, dass Scala nicht die Ursache des Problems ist, also versuche ich es zuerst in Java.
Sorry das ist ein bisschen irrelevant, um Ihr Problem zu lösen, aber ich dachte, ich würde erwähnen, dass Sie auf das String-Argument zu Ihren Enum-Konstruktoren verzichten können, wenn Sie sie genauso haben, wie Sie sie nennen ; Sie können auf denselben Wert zugreifen, indem Sie für die Enumeration .name() aufrufen. Ich glaube, die Methode toString() delegiert trotzdem an name(). – I82Much
mögliches Duplikat von [So liefern Sie Enum-Werte zu einer Annotation von einer Constant in Java] (http://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-annannotation-from- a-constant-in-java) –