我有一个看起来像这样的枚举,我需要验证它们的值
public enum UserRoles {
ROLE_ADMIN("ROLE_ADMIN"),
ROLE_CONFIG_EDITOR("ROLE_CONFIG_EDITOR"),
ROLE_USER("ROLE_USER");
UserRoles(String roleUser) {
}
}
这些值是通过 REST 端点提供的,如下所示:
curl -X POST http://localhost:8080/rolevalid -H 'Content-Type: application/json' -d'{"username": "andy", "roles": "ROLE_USER,WRONG_ROLE"}'
所以我正在做类似的事情来尝试验证发送到端点的角色:
String[] roleArray = user.roles()
.replace("[", "")
.replace("]", "")
.replace(" ", "")
.split(",");
List<String> roleList = new ArrayList<>(Arrays.asList(roleArray));
boolean hasRole = false;
for (UserRoles role : UserRoles.values()) {
if (roleList.contains(role.name())) {
hasRole = true;
}
}
如果提供的值之一正确,哪种方法会返回 true。但是我需要验证所有值是否正确,因此在上面的示例中
hasRole
变量应该为 false,因为 WRONG_ROLE
不是枚举的一部分。
对端点的有效调用是:
curl -X POST http://localhost:8080/rolevalid -H 'Content-Type: application/json' -d'{"username": "andy", "roles": "ROLE_USER"}'
或者
curl -X POST http://localhost:8080/rolevalid -H 'Content-Type: application/json' -d'{"username": "andy", "roles": "ROLE_USER,ROLE_ADMIN"}'
尝试学习Java
谢谢 安迪
如果此端点
/rolevalid
在您的控制之下,首先我建议对有效负载使用有效的JSON,例如:
{"username": "andy", "roles": ["ROLE_USER","ROLE_ADMIN"]}
然后使用一些标准框架将此数据获取到您的应用程序中(Jakarta、SpringBoot 等)。该框架将为您完成所有这一切,检查所有给定的角色是否有效。
不要理会字符串操作,在某些时候它会失败。
如果您想要的只是验证,那么您最好应该这样做:
var roles = Arrays.stream(user.roles()
.replace("[", "")
.replace("]", "")
.replace(" ", "")
.split(","))
.map(UserRoles::valueOf)
.toList();
UserRoles::valueOf
将简单地按名称查找枚举值,如果未找到则抛出 IllegalArgumentException
。
要验证所有匹配的角色,您需要反转搜索:
Set<String> roleList = Set.of(roleArray);
boolean hasRole = true;
for (UserRoles role : UserRoles.values()) {
if (roleList.contains(role.name())) {
hasRole = false;
break;
}
}
一个小改进是,您可以使用
Set
而不是 List
进行搜索 - 对于如此小的数据集,它不会真正产生影响,但对于仅搜索操作,如您的情况,它是正确的数据结构。