Sto sviluppando un'applicazione enterprise Java, che attualmente sta eseguendo operazioni di sicurezza Java EE per limitare l'accesso per determinate funzioni a utenti specifici. Ho configurato il server di applicazione e tutto, e ora sto usando il RolesAllowed-annotazione per fissare i metodi:Utilizzare il tipo Enum come parametro valore per @RolesAllowed-Annotation
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Quando uso l'annotazione in questo modo, funziona benissimo:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Ma questo non è quello che voglio, dato che devo usare una stringa qui, il refactoring diventa difficile, e gli errori di battitura possono accadere. Quindi, invece di usare una stringa, mi piacerebbe usare un valore Enum come parametro per questa annotazione. L'Enum assomiglia a questo:
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;
}
}
Così ho cercato di usare l'Enum come parametro come questo:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
Ma poi ho il seguente errore del compilatore, anche se Enum.name solo restituisce una stringa (che è sempre costante, non è vero?).
The value for annotation attribute RolesAllowed.value must be a constant expression`
La prossima cosa che ho provato è stato quello di aggiungere una stringa finale, rispetto alla mia Enum:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
Ma anche questo non funziona come parametro, con conseguente lo stesso errore del compilatore:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
Come posso ottenere il comportamento desiderato? Ho persino implementato il mio intercettore per usare le mie annotazioni, che sono belle, ma troppe righe di codice per un piccolo problema come questo.
NEGAZIONE
Questa domanda era in origine una domanda Scala. Ho scoperto che Scala non è la fonte del problema, quindi prima provo a farlo in Java.
Spiacente, questo è un po 'irrilevante per risolvere il tuo problema ma ho pensato di menzionare che puoi rinunciare all'argomento String ai tuoi costruttori enum se hai intenzione di averli come quelli che li chiami ; puoi accedere allo stesso valore chiamando .name() sull'enumerazione. Credo che il metodo toString() deleghi comunque a name(). – I82Much
possibile duplicato di [Come fornire valore Enum a un'annotazione da una costante in Java] (http://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from- a-constant-in-java) –