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

为什么我的角色Set集合会抛出UnsupportedOperationException异常

问题根因

你遇到的异常是因为构造函数中使用Set.of(Role.USER)初始化roles字段导致的:
JDK 9及以上版本中,Set.of()、List.of()、Map.of()这类工厂方法返回的是不可变集合实例,原生不支持add、remove这类修改操作,调用时就会直接抛出UnsupportedOperationException,你调试看到的ImmutableCollections就是JDK内置的不可变集合实现类。

解决方案

最直接的修复方式是修改构造函数,将不可变集合转为可变集合初始化:

public User(String username, String email, String password) {
    this.username = username;
    this.email = email;
    this.password = password;
    this.enabled = true;
    // 将Set.of返回的不可变集合转为可变的HashSet
    this.roles = new HashSet<>(Set.of(Role.USER));
}

修改后roles就是可变的HashSet实例,后续调用addRole方法添加角色就不会再抛出异常。

如果你不想修改实体类的构造逻辑,也可以新增一个支持传入角色集合的构造函数,创建admin用户时直接传入包含Role.ADMIN的集合,无需后续调用addRole方法追加。

额外注意

如果你的User是JPA实体类,本身就要求集合字段是可变类型,不可变集合还可能导致后续JPA更新角色属性时出现持久化异常,使用可变集合更符合规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:48:05