Преобразование коллекции <Object>в список <String> - PullRequest
0 голосов
/ 27 января 2019

У меня проблема с получением пользовательских ролей как String List из Collection ролей в объекте User. Я хочу получить роли пользователя как List, чтобы реализовать его в моем методе UserServiceImlementation on loadUserByUsername, в котором я передаю имена ролей в виде списка в класс 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();
}

}

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Сделайте что-то вроде этого,

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

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

Возможно, вам потребуется переопределить метод toString класса Role, в зависимости от сложности модели.

0 голосов
/ 27 января 2019

Обычно вам не нужно конвертировать роли в List<String>, вы можете построить List<GrantedAuthority> на

user.getRoles().stream()
    .map(role -> new SimpleGrantedAuthority(role.getRoleName()))
    .collect(Collectors.toList());

Если вам действительно нужно это List<String>, тогда вы можете сделать

user.getRoles().stream()
    .map(Role::getRoleName)
    .collect(Collectors.toList());
0 голосов
/ 27 января 2019

В этой части

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

ваши roleNames содержат список user.getRoles (). ToString () вместо ожидаемых имен ролей;

Попробуйте

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

Также добавьте переходные процессы в поля ROLE_USER и ROLE_ADMIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...