Estoy desarrollando una aplicación empresarial Java, actualmente haciendo cosas de seguridad Java EE para restringir el acceso de determinadas funciones a usuarios específicos. He configurado el servidor de aplicaciones y todo, y ahora estoy usando el RolesAllowed-anotación para asegurar los métodos:Usar el tipo Enum como un parámetro de valor para @ RolesAllowed-Annotation
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Cuando uso la anotación como éste, que funciona bien:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Pero esto no es lo que quiero, ya que tengo que usar una Cadena aquí, la refacturación se vuelve difícil y pueden ocurrir errores tipográficos. Entonces, en lugar de usar un String, me gustaría utilizar un valor Enum como parámetro para esta anotación. La enumeración es el siguiente:
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;
}
}
así que traté de usar la enumeración como un parámetro de la siguiente manera:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
Pero entonces me sale el siguiente error del compilador, aunque Enum.name sólo devuelve una cadena (que siempre es constante, ¿no?).
The value for annotation attribute RolesAllowed.value must be a constant expression`
La siguiente cosa que intenté fue agregar un final String adicional a mi enumeración:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
Pero esto también no funciona como un parámetro, lo que resulta en el mismo error del compilador:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
¿Cómo puedo lograr el comportamiento que quiero? Incluso implementé mi propio interceptor para usar mis propias anotaciones, lo cual es hermoso, pero hay demasiadas líneas de códigos para un pequeño problema como este.
RENUNCIA
Esta pregunta fue originalmente una pregunta Scala. Descubrí que Scala no es la fuente del problema, así que primero intento hacerlo en Java.
Lo siento, esto es un poco irrelevante para resolver su problema, pero pensé que mencionaría que puede prescindir del argumento String para sus constructores enum si solo los va a tener igual a los que usted los nombra ; puede acceder al mismo valor llamando a .name() en la enumeración. Creo que el método toString() delega a name() de todos modos. – I82Much
posible duplicado de [Cómo suministrar el valor de Enum a una anotación de una constante en Java] (http://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from- a-constant-in-java) –