You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何校验列表中所有值是否匹配指定Java枚举类型?

问题描述

我有如下UserRoles枚举类,需要校验接口传入的角色值是否全部合法:

public enum UserRoles {
    ROLE_ADMIN("ROLE_ADMIN"),
    ROLE_CONFIG_EDITOR("ROLE_CONFIG_EDITOR"),
    ROLE_USER("ROLE_USER");
    
    UserRoles(String roleUser) {
    }
}

角色值通过JSON传递,非法请求示例:

{"username": "andy", "roles": "ROLE_USER,WRONG_ROLE"}

我原本的校验代码只能判断是否存在至少一个合法角色,但需求是所有传入的角色必须全部合法——比如上面的示例因为包含WRONG_ROLE,校验结果应该返回false。合法请求示例:

{"username": "andy", "roles": "ROLE_USER"}

或

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

原本的校验代码如下:

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;
  }
}
解决方案

方式一:集合匹配校验

核心思路是先把所有合法角色存入集合,再检查传入的每一个角色是否都在合法集合内:

// 处理角色字符串,得到去重后的输入角色集合
String[] roleArray = user.roles()
    .replace("[", "")
    .replace("]", "")
    .replace(" ", "")
    .split(",");
Set<String> inputRoles = new HashSet<>(Arrays.asList(roleArray));

// 预存所有合法角色的名称
Set<String> validRoles = Arrays.stream(UserRoles.values())
    .map(UserRoles::name)
    .collect(Collectors.toSet());

// 校验:所有输入角色必须都在合法集合中
boolean allValid = inputRoles.stream().allMatch(validRoles::contains);

方式二:枚举转换异常捕获

利用枚举的valueOf方法,若传入角色无法转换为UserRoles枚举,直接判定为非法:

String[] roleArray = user.roles()
    .replace("[", "")
    .replace("]", "")
    .replace(" ", "")
    .split(",");

boolean allValid = true;
for (String roleStr : roleArray) {
    try {
        UserRoles.valueOf(roleStr);
    } catch (IllegalArgumentException e) {
        allValid = false;
        break; // 发现非法角色,立即终止校验
    }
}

额外优化建议

  • 如果接口接收的JSON中roles字段本身是数组类型,建议直接用List<String>接收字段,避免手动替换[]的冗余操作。
  • 用Set存储合法角色可以提升查询效率,尤其是枚举值较多的场景。

内容的提问来源于stack exchange,提问作者Tallen67

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:22:47