Verwenden Sie den Aufzählungstyp als Wertparameter für @ RolesAllowed-Annotation

Ich entwickle eine Java-Unternehmensanwendung, die derzeit Java EE-Sicherheitsmaßnahmen durchführt, um den Zugriff auf bestimmte Funktionen auf bestimmte Benutzer zu beschränken. Ich habe den Anwendungsserver und alles konfiguriert und verwende jetzt die Annotation RolesAllowed, um die Methoden zu sichern:

@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
    String[] value();
}

Wenn ich die Annotation so verwende, funktioniert sie einwandfrei:

@RolesAllowed("STUDENT")
public void update(User p) { ... }

Aber dies ist nicht das, was ich will, da ich hier einen String verwenden muss, das Refactoring schwierig wird und Tippfehler auftreten können. Daher möchte ich anstelle eines Strings einen Enum-Wert als Parameter für diese Annotation verwenden. Das Enum sieht so 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;
    }
}

So habe ich versucht, die Enum als Parameter wie folgt zu verwenden:

@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }

Aber dann erhalte ich den folgenden Compiler-Fehler, obwohl Enum.name nur einen String zurückgibt (der immer konstant ist, nicht wahr?).

Der Wert für das Annotation-Attribut RolesAllowed.value muss ein konstanter Ausdruck sein .`

Das nächste, was ich versuchte, war, meinem Enum eine zusätzliche letzte Zeichenfolge hinzuzufügen:

public enum RoleType {
    ...
    public static final String STUDENT_ROLE = STUDENT.toString();
    ...
}

Aber dies funktioniert auch nicht als Parameter, was denselben Compilerfehler zur Folge hat:

// 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 Interceptor implementiert, um meine eigenen Annotationen zu verwenden. Das ist schön, aber viel zu viele Codezeilen für ein kleines Problem wie dieses.

HAFTUNGSAUSSCHLUS

Diese Frage war ursprünglich ein Scala frage. Ich habe herausgefunden, dass Scala nicht die Ursache des Problems ist, und versuche dies zuerst in Java.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage