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;
。
添加回答
舉報