Я занимаюсь разработкой корпоративного приложения Java, в настоящее время занимаюсь вопросами безопасности Java EE, чтобы ограничить доступ к определенным функциям для определенных пользователей. Я настроил сервер приложений и все, и теперь я использую аннотацию RolesAllowed для защиты методов:
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
Когда я использую аннотацию, подобную этой, она отлично работает:
@RolesAllowed("STUDENT")
public void update(User p) { ... }
Но это не то, что я хочу, так как я должен использовать строку здесь, рефакторинг становится трудным, и могут произойти опечатки. Поэтому вместо использования строки я бы хотел использовать значение 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.