3 回答
TA贡献1839条经验 获得超15个赞
构造HashSet函数接受一个Collection,而不是单个元素。这一行:
user.setRoles(new HashSet<>(roleRepository.findAll()));
使用您的所有角色创建一个新的 HashSet。这条线
user.setRoles(new HashSet<>(roleRepository.findByRole(2)));
尝试在构造函数中使用单个元素创建一个新的 HashSet,这将不起作用,因为 Role 不是 Collection 的实例。
只需获取您的角色,创建一个 HashSet,添加角色,然后设置用户的角色:
Role role = roleRepository.findByRole(2);
Set<Role> roles = new HashSet<>();
roles.add(role);
user.setRoles(roles);
TA贡献1811条经验 获得超4个赞
控制器代码:
@PostMapping("/do_register")
public String registration(@ModelAttribute("user") User user, Model model)
{
user.setRoles(new HashSet<>(roleRepository.findByName("USER")));
user.setEnabled(true);
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
return "signup";
}
角色存储库代码:
public interface RoleRepository extends JpaRepository<Role, Integer>
{
public Set<Role> findByName(String USER);
}
它对我来说工作得很好,因为我也有同样的问题。
TA贡献1847条经验 获得超7个赞
如果您使用的是 Spring Data 存储库,那么一个问题是您选择的查询名称/参数类型与您的实体不匹配。没有名为“ID”的字段,类型role
是String
,不是int
。
您最好的选择是让您的存储库方法签名
Role findByRole(String roleName);
您还应该更改Role
对象中 ID 的名称和数据类型 - 按照约定,Java 使用 camelCase,而不是 snake_case,虽然对于可能保持较小的 ROLE 之类的表来说,int 可能很好,但在一般情况下,您会想要给你更大的键空间long
。在您的对象中为您的 id 提供一致的数据类型也更好 - 它使您不必考虑“等等,这是一个 int 还是 long?”。应该是private long roleId;
。
添加回答
举报