验证列表是否为枚举

问题描述 投票:0回答:3

我有一个看起来像这样的枚举,我需要验证它们的值

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

谢谢 安迪

java enums java-17
3个回答
0
投票

如果此端点

/rolevalid
在您的控制之下,首先我建议对有效负载使用有效的JSON,例如:

{"username": "andy", "roles": ["ROLE_USER","ROLE_ADMIN"]}

然后使用一些标准框架将此数据获取到您的应用程序中(Jakarta、SpringBoot 等)。该框架将为您完成所有这一切,检查所有给定的角色是否有效。

不要理会字符串操作,在某些时候它会失败。


0
投票

如果您想要的只是验证,那么您最好应该这样做:

var roles = Arrays.stream(user.roles()
                              .replace("[", "")
                              .replace("]", "")
                              .replace(" ", "")
                              .split(","))
      .map(UserRoles::valueOf)
      .toList();

UserRoles::valueOf
将简单地按名称查找枚举值,如果未找到则抛出
IllegalArgumentException


0
投票

要验证所有匹配的角色,您需要反转搜索:

Set<String> roleList = Set.of(roleArray);

boolean hasRole = true;
for (UserRoles role : UserRoles.values()) {
  if (roleList.contains(role.name())) {
    hasRole = false;
    break;
  }
}

一个小改进是,您可以使用

Set
而不是
List
进行搜索 - 对于如此小的数据集,它不会真正产生影响,但对于仅搜索操作,如您的情况,它是正确的数据结构。

© www.soinside.com 2019 - 2024. All rights reserved.