Я занимаюсь разработкой корпоративного приложения Java, которое в настоящее время использует материалы безопасности Java EE для ограничения доступа к определенным функциям для конкретных пользователей. Я настроил сервер приложений и все, и теперь я использую RolesAllowed-аннотацию, чтобы обеспечить методы:Использовать тип Enum в качестве параметра значения для @ RolesAllowed-Annotation
@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 просто возвращает строку (который всегда постоянный, не так ли?).
The value for annotation attribute RolesAllowed.value must be a constant expression`
Следующая вещь, которую я попытался было добавить еще окончательный строки в моей 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.
Извините, что это немного не имеет отношения к решению вашей проблемы, но я думал, что упомянул, что вы можете обойтись без аргумента String для своих конструкторов enum, если вы просто будете иметь их такими же, как вы их называете ; вы можете получить доступ к этому же значению, вызвав имя .name() в перечислении. Я считаю, что метод toString() делегирует имя() в любом случае. – I82Much
Возможный дубликат [Как указать значение Enum для аннотации из константы в Java] (http://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from- a-constant-in-java) –