私はJavaエンタープライズアプリケーションを開発しています.現在、特定の機能へのアクセスを特定のユーザーに制限するためにJava EEセキュリティを行っています. アプリケーションサーバーとすべてを構成し、現在、メソッドを保護するために RolesAllowed アノテーションを使用しています。
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
このような注釈を使用すると、正常に機能します。
@RolesAllowed("STUDENT")
public void update(User p) { ... }
しかし、これは私が望んでいるものではありません。ここでは文字列を使用する必要があり、リファクタリングが難しくなり、タイプミスが発生する可能性があります。したがって、文字列を使用する代わりに、この注釈のパラメーターとして 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 でこれを実行してみます。