亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從一組角色中只獲得一個角色

如何從一組角色中只獲得一個角色

梵蒂岡之花 2022-10-07 16:32:44
我正在嘗試實現一個簡單的彈簧安全項目,基本上我有用戶和角色實體。我有一組角色“管理員”和“用戶”?,F在我只想分配“用戶”角色以及創建一個新用戶。我曾嘗試使用具有相同問題的列表和集合。用戶實體有 Set<Role>public class User {    @Id    @Column(name = "user_id")    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int user_id;    @NotNull    @Column(name = "user_name", unique = true)    private String userName;    @NotNull    @Column(name = "first_name")    private String firstName;    @NotNull    @Column(name = "last_name")    private String lastName;    @Column(name = "roles")    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))    private Set<Role> roles;}和角色實體:public class Role {    }    @Id    private int role_id;    private String role;}這是將用戶保存到我的數據庫的 saveMyUser 方法。當我使用:public void saveMyUser(User user) {    Set<Role> hash_Set = new HashSet<Role>();    user.setPassword(encoder().encode(user.getPassword()));        user.setRoles(new HashSet<>(roleRepository.findAll())); <--- Here        userRepository.save(user);    }user.setRoles(new HashSet<>(roleRepository.findAll()));將所有角色分配給用戶,因為我只想為新用戶分配“USER”角色。我試過了user.setRoles(new HashSet<>(roleRepository.findByRole(2)));,也試過user.setRoles(new HashSet<>(roleRepository.findByID(2)));這個錯誤:無法推斷 HashSet<> 的類型參數。我的數據庫中的角色表:role_id    role1          ADMIN2          USER
查看完整描述

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);


查看完整回答
反對 回復 2022-10-07
?
波斯汪

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);

它對我來說工作得很好,因為我也有同樣的問題。


查看完整回答
反對 回復 2022-10-07
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

如果您使用的是 Spring Data 存儲庫,那么一個問題是您選擇的查詢名稱/參數類型與您的實體不匹配。沒有名為“ID”的字段,類型roleString,不是int

您最好的選擇是讓您的存儲庫方法簽名

Role findByRole(String roleName);

您還應該更改Role對象中 ID 的名稱和數據類型 - 按照約定,Java 使用 camelCase,而不是 snake_case,雖然對于可能保持較小的 ROLE 之類的表來說,int 可能很好,但在一般情況下,您會想要給你更大的鍵空間long。在您的對象中為您的 id 提供一致的數據類型也更好 - 它使您不必考慮“等等,這是一個 int 還是 long?”。應該是private long roleId;


查看完整回答
反對 回復 2022-10-07
  • 3 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號