如何校验列表中所有值是否匹配指定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
相关产品推荐
相关产品推荐

