为什么我的角色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
相关产品推荐
相关产品推荐

