gpt4 book ai didi

java - 使用 Enum 类型作为 @RolesAllowed-Annotation 的值参数

转载 作者:IT老高 更新时间:2023-10-28 20:25:32 24 4
gpt4 key购买 nike

我正在开发一个 Java 企业应用程序,目前正在做 Java EE 安全工作,以限制特定用户对特定功能的访问。我配置了应用程序服务器和所有内容,现在我使用 RolesAllowed-annotation 来保护方法:

@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}

当我像这样使用注释时,它工作正常:

@RolesAllowed("STUDENT")
public void update(User p) { ... }

但这不是我想要的,因为我必须在这里使用字符串,重构变得困难,并且可能会发生拼写错误。因此,我不想使用字符串,而是使用枚举值作为此注释的参数。枚举看起来像这样:

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`

接下来我尝试在我的枚举中添加一个额外的最终字符串:

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 中执行此操作。

最佳答案

这个怎么样?

public enum RoleType {
STUDENT(Names.STUDENT),
TEACHER(Names.TEACHER),
DEANERY(Names.DEANERY);

public class Names{
public static final String STUDENT = "Student";
public static final String TEACHER = "Teacher";
public static final String DEANERY = "Deanery";
}

private final String label;

private RoleType(String label) {
this.label = label;
}

public String toString() {
return this.label;
}
}

在注释中你可以像这样使用它

@RolesAllowed(RoleType.Names.DEANERY)
public void update(User p) { ... }

一个小问题是,对于任何修改,我们需要在两个地方进行更改。但由于它们在同一个文件中,因此不太可能错过。作为返回,我们获得了不使用原始字符串并避免复杂机制的好处。

或者这听起来很愚蠢? :)

关于java - 使用 Enum 类型作为 @RolesAllowed-Annotation 的值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com