有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java不知道如何查找ByRole以返回自定义的用户列表

我正在尝试根据角色列出应用程序中的用户。我的控制器中有一个端点,它试图调用我的userService类。findByRoles方法,但我不知道如何在没有字符串角色的情况下放置我想要的角色(行不通)

管理员控制器。java方法:

@GetMapping(path="/users")
public String showUsers( Model model){
    var userList = (List<User>) userService.findByRoles("ROLE_TEACHER"); // dont know how to pass a role here
    model.addAttribute("userList", userList);
    return "users";
}

用户。java

@Entity
@Table(name = "user_table", schema = "public")
public class User {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long user_id;

    @Column(name = "name")
    private String name;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "email")
    private String email;

    @Column(name = "confirmed")
    private boolean confirmed;

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.DETACH}, fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_role_table",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "role_id"))
    private Collection<Role> roles = new HashSet<>();



    /*******************************************
     * Setters and getters
     *******************************************/

    public Long getId() {
        return user_id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setConfirmed(Boolean confirmed) {
        this.confirmed = confirmed;
    }

    public Boolean getConfirmed() {
        return confirmed;
    }

    public void setRoles(Collection roles) {
        this.roles = roles;
    }

    public Collection<Role> getRoles() { return this.roles;
    }
}

用户存储库

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
    User findByEmail(String email);
    User findByRoles(Role role);
}

角色还原性

public interface RoleRepository extends JpaRepository<Role, Long> {

    Role findByName(String name);
}

IUserService。java

public interface IUserService {

    User registerNewUserAccount(UserDto userDto);

    List<User> findAll();

    Optional<User> findById(Long id);

    User findByRoles(Role role);

    public void delete(Long id);

    public User updateConfirmed(Long id);

}

用户服务。java方法:

@Override
public User findByRoles(Role role) {
    return userRepository.findByRoles(role);
}

有什么建议可以帮助我解决这个问题吗


共 (1) 个答案

  1. # 1 楼答案

    在对这些类进行了调整之后,我认为解决这个问题最合理的方法是使用roleRepository方法findByName。此外,在userRepository、IUserService&;用于返回列表的UserService(请查看我对此答案的评论)

    已更改IUserService。java到:

    public interface IUserService {
    
         User registerNewUserAccount(UserDto userDto);
    
         List<User> findAll();
    
         Optional<User> findById(Long id);
    
         List<User> findAllByRoles(String roles); //Added this new method (VERY IMPORTANT for returning multiple users)
    
         User findByRoles(String roles);
    
         public void delete(Long id);
    
         public User updateConfirmed(Long id);
    }
    

    已更改用户服务。java方法,用于:

    @Override
    public User findByRoles(String roles) {
        return userRepository.findByRoles(roleRepository.findByName(roles)); // Using roleRepository here
    }
    
    // Added below findAllbyRoles to return a list
    
    @Override
    public List<User> findAllByRoles(String roles){
        return userRepository.findAllByRoles(roleRepository.findByName(roles));
    }
    

    更改了管理员控制器。java方法,用于:

    @GetMapping(path="/users")
    public String showUsers( Model model){
        List<User> userList = userService.findAllByRoles("ROLE_STUDENT");
        userList.addAll(userService.findAllByRoles("ROLE_TEACHER"));
        model.addAttribute("userList", userList);
        return "users";
    }