Я занимаюсь разработкой корпоративного приложения Java, в настоящее время занимающегося безопасностью Java EE, чтобы ограничить доступ к определенным функциям определенным пользователям. Я настроил сервер приложений и все такое, и теперь я использую аннотацию RolesAllowed для защиты методов:
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Когда я использую такую аннотацию, она отлично работает:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Но это не то, что я хочу, так как я должен использовать String здесь, рефакторинг становится трудным, и опечатки могут произойти. Поэтому вместо использования String я хотел бы использовать значение Enum в качестве параметра для этой аннотации. Enum выглядит следующим образом:
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;
}
}
Итак, я попытался использовать Enum в качестве параметра следующим образом:
@RolesAllowed(RoleType.DEANERY.name())
public void update(User p) { ... }
Но тогда я получаю следующую ошибку компилятора, хотя Enum.name просто возвращает строку (которая всегда постоянна, не так ли?).
Значение атрибута аннотации RolesAllowed.value должно быть постоянным выражением `
Следующее, что я пробовал, это добавить дополнительную финальную строку в мой Enum:
public enum RoleType {
...
public static final String STUDENT_ROLE = STUDENT.toString();
...
}
Но это также не работает как параметр, приводя к той же ошибке компилятора:
// The value for annotation attribute RolesAllowed.value must be a constant expression
@RolesAllowed(RoleType.STUDENT_ROLE)
Как я могу достичь желаемого поведения? Я даже реализовал свой собственный перехватчик, чтобы использовать свои собственные аннотации, что красиво, но слишком много строк кодов для такой небольшой проблемы.
ОТКАЗ
Этот вопрос первоначально был вопросом Scala. Я узнал, что Scala не является источником проблемы, поэтому я сначала попытаюсь сделать это на Java.