【问题标题】:Converting Collection<Object> to List<String>将 Collection<Object> 转换为 List<String>
【发布时间】:2019-06-20 17:04:42
【问题描述】:

我无法从Collection 对象中的Collection 获取用户角色为String List。 我想将用户角色设置为List 以在我的loadUserByUsername 方法上的UserServiceImlementation 中实现它,其中我将角色名称作为列表传递给SocialUserDetailsImplementation 类以使社交登录可用。将不胜感激。

用户模型

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {

    public static final String ROLE_USER = "ROLE_USER";
    public static final String ROLE_ADMIN = "ROLE_ADMIN";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name ="user_id", nullable = false)
    private Long userId;

    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String userName;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "user_id"),
            inverseJoinColumns = @JoinColumn(
                    name = "role_id", referencedColumnName = "id"))
    private Collection<Role> roles;

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


    public User() {
        super();
        this.enabled=false;

    }

    public User(String firstName, String lastName, String email, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public User(String firstName, String lastName, String email, String password, Collection<Role> roles) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.roles = roles;
    }

    public User(String firstName, String lastName, String email, String password, String userName, Collection<Role> roles) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.userName = userName;
        this.roles = roles;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPassword() {
        return password;
    }

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

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

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

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }


}

UserServiceImpl

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;




    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        User user = userRepository.findByUserName(userName);
        if (user == null) {
            throw new UsernameNotFoundException("Invalid username or password.");
        }


       List<String> roleNames =  (Collectors.toList(user.getRoles()));



        List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>();
        if (roleNames != null) {
            for (String role : roleNames) {
                GrantedAuthority authority = new SimpleGrantedAuthority(role);
                grantList.add(authority);
            }
        }


        SocialUserDetailsImpl userDetails = new SocialUserDetailsImpl(user,  roleNames);
                return userDetails;
    }

SocialUserDetailsImpl

public class SocialUserDetailsImpl implements SocialUserDetails {

private static final long serialVersionUID = 1L;
private List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
private User user;

public SocialUserDetailsImpl(User user, List<String> roleNames) {
    this.user = user;

    for (String roleName : roleNames) {

        GrantedAuthority grant = new SimpleGrantedAuthority(roleName);
        this.list.add(grant);
    }
}

@Override
public String getUserId() {
    return this.user.getUserId() + "";
}

@Override
public String getUsername() {
    return user.getUserName();
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return list;
}

@Override
public String getPassword() {
    return user.getPassword();
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return this.user.isEnabled();
}

}

【问题讨论】:

  • 那么问题是什么?
  • 问题是如何获取用户角色为 List
  • @D.Skowron 1) 在粘贴之前格式化您的代码(所有主要的 Java IDE 都可以这样做) 2) 编辑您的问题并使其更清晰 - 特别是哪一行没有按预期工作?您的期望是什么,实际发生了什么? 3)将您的问题归结为核心-在我看来,您的问题与任何形式的 JPA 无关。
  • 所以基本上这条线是问题? List&lt;String&gt; roleNames = (Collectors.toList(user.getRoles()));
  • @aBnormaLz 是的,这是主要问题。

标签: java spring spring-security


【解决方案1】:

在这部分

List<String> roleNames =  (Collectors.toList(user.getRoles()));

您的角色名称包含 user.getRoles().toString() 列表,而不是预期的角色名称;

试试

List<String> roleNames =  user.getRoles().stream()
    .map(Role::getName)
    .collect(Collectors.toList());

另外,将瞬态添加到 ROLE_USER 和 ROLE_ADMIN 字段。

【讨论】:

  • U 表示瞬态:公共瞬态 String ROLE_USER = "ROLE_USER";公共随机字符串 ROLE_ADMIN = "ROLE_ADMIN";在角色模型中?
  • 是的;抱歉,我忘记了存储静态字段。瞬态是多余的,真的。
【解决方案2】:

做这样的事情,

List<Object> roleNames =  (Collectors.toList(user.getRoles()));
List<String> roleNamesString= new List<string> ();

for(Object a: roleNames){
   roleNameString.add(String.valueOf(a));
}

您可能需要重写 Role 类的 toString 方法,具体取决于模型的复杂性。

【讨论】:

    【解决方案3】:

    基本上你不需要将角色转换为List&lt;String&gt;,你可以通过

    构建你的List&lt;GrantedAuthority&gt;
    user.getRoles().stream()
        .map(role -> new SimpleGrantedAuthority(role.getRoleName()))
        .collect(Collectors.toList());
    

    如果你真的需要 List&lt;String&gt; 那么你可以这样做

    user.getRoles().stream()
        .map(Role::getRoleName)
        .collect(Collectors.toList());
    

    【讨论】:

    • 谢谢。这节省了我一整天的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多